Есть ли проблемы с приоритетом Ruby при использовании Proc.call и Proc. []? - PullRequest
3 голосов
/ 23 февраля 2010

Недавно у меня был разговор с другом о Ruby's Proc.Вы можете позвонить Proc одним из нескольких способов.Один способ - вызвать Proc.call:

p = Proc.new { |x| "hello, #{x}" }
p.call "Bob"
=> "hello, Bob"

Другой - использовать фигурные скобки, Proc.[]:

p ["Bob"]
=> "hello, Bob"

Есть ли здесь какие-либо потенциальные проблемы с приоритетом или эти два утверждения полностью взаимозаменяемы?Если нет, то можете ли вы привести пример контекста, в котором будут предоставляться разные результаты?

1 Ответ

2 голосов
/ 23 февраля 2010

Техника #call позволяет приоритету оператора потенциально скрывать намерения:

p = Proc::new do |a1| Proc::new do |a2| "#{a1.inspect}:#{a2.inspect}" end end
p.call([1,2,3]).call [1]
=> => "[1, 2, 3]:[1]"
p.call [1,2,3][1]
=> #<Proc:0x7ffa08dc@(irb):1>
p.call([1,2,3])[1]
=> "[1, 2, 3]:1"
p[[1,2,3]][[1]]
=> "[1, 2, 3]:[1]"

Синтаксис [] делает синтаксическую ассоциацию аргументов метода более надежной, но вы бы достигли того же эффекта, поставив скобки вокруг аргументов в Proc#call.

...