Каковы преимущества функций proc для методов - PullRequest
3 голосов
/ 18 августа 2011

Я решал некоторые проблемы на Project Euler и упомянул, что я всегда заключаю короткие методы в функции proc.Я спросил себя " Почему? ".Ответ был « Я не знаю. Может быть, потому что оно короткое? ».

Так в чем же преимущества функций proc перед обычными методами, за исключением того, что они короткие:)

# Proc
is_prime = proc{|number| !((number%2 == 0) || (3..Math.sqrt(number).to_i).step(2).any?{|n| (number%n).zero?})}

# Ordinary method
def is_prime(number)
  !((number%2 == 0) || (3..Math.sqrt(number).to_i).step(2).any?{|n| (number%n).zero?})
end

1 Ответ

6 голосов
/ 18 августа 2011

Способность передавать их и хранить их в структурах данных - это то, что сразу приходит на ум.Я использовал последний случай не слишком долго в небольшом парсере командной строки: проанализируйте пользовательский ввод с помощью регулярного выражения и вызовите commands[command] с остальной частью проанализированной строки в качестве аргументов.Конечно, вы можете сделать то же самое с методами и send, но ИМХО хэш команд лучше.Еще одна вещь, которую я иногда использую - хотя это не очень распространено в Ruby - это curry procs, что вы не можете сделать с помощью метода:

>> multiplier = proc { |x, y| x * y }
=> #<Proc:0x00000100a158f0@(irb):1>
>> times_two = multiplier.curry[2]
=> #<Proc:0x00000100a089c0>
>> times_two[5]
=> 10

EDIT: Вот ещепример (упрощенный, без обработки ошибок):

 commands = { :double => proc { |x| x * 2 }, :half => proc { |x| x / 2 } }
 run_command = proc do 
     command, arg = STDIN.gets.split 
     commands[command.intern][arg.to_i]
 end
 run_command.call
 half 10
 # => 5
 run_command[]
 double 5
 # => 10
...