Найти в Дзене

Практика Ruby №17(метапрограммирование, работа с файлами, атрибуты доступа(linux))

Здравствуйте! По большей части создаю это для себя, но если кому-то пригодится попрактиковаться в Ruby с самого начала, то welcome =) По мере своего продвижения обучения буду пополнять конспект новыми знаниями, поэтому не судите строго По сути, это просто краткий конспект, в который я записываю все, что хочу запомнить или сложно запоминается, плюсом ко всему записывать и придумывать себе задания для практики. Все материалы для конспекта взяты с rubyschool.us Метапрограммирование оператор send - отправить аргументы в функцию def mm
...
end send :mm (метапрограммирование)
send "mm" (метапрограммирование)
mm С параметрами: def mm par1
puts par1
end send :mm, 555 / send :mm, :x=>2, :y=>3(для хэша) Иными словами, можно вызывать метод по его имени, например: def aaa
puts "1"
end def bbb
puts "2"
end print "Enter method to call: "
a = gets.strip send a Для класса: class Something
attr_accessor :name
def initialize
send "name=", "Alex"
end
end s = Something.new
puts s.name В данном
Оглавление

Здравствуйте!

По большей части создаю это для себя, но если кому-то пригодится попрактиковаться в Ruby с самого начала, то welcome =)

По мере своего продвижения обучения буду пополнять конспект новыми знаниями, поэтому не судите строго

По сути, это просто краткий конспект, в который я записываю все, что хочу запомнить или сложно запоминается, плюсом ко всему записывать и придумывать себе задания для практики.

Все материалы для конспекта взяты с rubyschool.us

Метапрограммирование

оператор send - отправить аргументы в функцию

def mm
...
end
send :mm (метапрограммирование)
send "mm"
(метапрограммирование)
mm

С параметрами:

def mm par1
puts par1
end
send :mm, 555 / send :mm, :x=>2, :y=>3(для хэша)

Иными словами, можно вызывать метод по его имени, например:

def aaa
puts "1"
end
def bbb
puts "2"
end
print "Enter method to call: "
a = gets.strip
send a

Для класса:

class Something
attr_accessor :name
def initialize
send "name=", "Alex"
end
end
s = Something.new
puts s.name

В данном примере благодаря параметру attr_accessor, в конструкторе initialize с помощью send можно вызвать метод "name=", и присвоить ему какой либо параметр по синтаксису оператора send. То есть эта запись аналогична тому, что в конструкторе определить @name и присвоить переменной значение.

class Something
attr_accessor :x, :y
def initialize hash
hash.each do |key, value|
send "#{key}=", value
end
end
end
s=Something.new :x=>1, :y=>2
puts s.x

_________________________________________

class Someting
def method_missing name
...
end
end
s = Something.new
s.asdasddas

method_missing(резервированное название метода, так же как и initialize) выведет сообщение, что метод указанный к объекту класса отсутствует.(работает не только для класса)

define_method

send :define_method, "aaa" do
puts "hello, i'm new method"
end
aaa
равнозначно этому:
def aaa
puts "hello, i'm new method"
end
aaa

Пример:

print "Name of method to define: "
method_name = gets.strip
send :define_method, method_name do
puts "hello, i'm new method
end
send method_name

Работа с файлами

output = File.open (filename, "r")
output.write "someting"
output.close

где
filename - имя файла с расширением(указать с полным путем к файлу, если не указан, будет открыт файл из текущего каталога), а параметр "r" означает read only(только для чтения)
"w" - параметр для записи
"r+" "w+" - чтения и для записи
"a"(append/добавить)
- открыть файл с режимом для записи и передвинуть запись в конец файла, по другому выражаясь, добавить в конец файла

Чтение из файла:
input = File.open "test.txt", "r"
while line = input.gets
puts line
end
input.close

Атрибуты доступа/параметры доступа к файлу

r - read
w - write
x - execute

Для Linux OS
chmod 777 file1.rb

r/w/x: их получается 8 штук (от 0 до 7)
r w x
0 0 1 | 1
0 1 0 | 2
0 1 1 | 3
1 0 0 | 4
1 0 1 | 5
1 1 0 | 6
1 1 1 | 7
0 0 0 | 0
Первое число это для владельца файла
Второе число для группы
Третье число - все остальные
то есть при 777 у всех есть полный доступ к файлу: все его могут записывать, читать и исполнять
Популярные комбинации:
755
666
644

Dir.pwd - показывает текущую директорию
Dir.chdi r- меняет директорию (/- работает с этим слешом)
Dir.entries - возвращает массив всех файлов

Практика:

1) создать файл task.txt, в котором записано 12 месяцев и зарплата в виде:
January,100
February, 30
...
Сделать вывод через интерполяцию, посчитать сумму за год сделать ее вывод (подсказка использую метод split)
Ответ

2) рассчитать прибыль за 6 месяцев
Ответ

3) написать программу, которая ищет нужный файл на диске C:\
пока никак не осилю, это слишком