2012-04-10 3 views
1

Я озадачен над следующим кодом:Понимание прок в рубине

Proc.new do |a| 
    a.something "test" 

    puts a.something 
    puts "hello" 
end 

Он не бросает какие-либо ошибки при запуске. Однако ничего не печатается ни для puts. Мне любопытно, что «задание» a.something. Возможно, это вызов метода w/parens. Что происходит в приведенном выше коде?

+2

Этот код ничего не делает, за исключением создания замыкания, которое никогда не запускается. –

+2

Вы фактически используете 'Proc' или просто объявляете его? –

+0

Он возвращается из метода (который я не писал). Более общий рубиновый вопрос: как работает поле 'something' в' a' в приведенном выше примере? Могут ли поля просто объявляться на объекты в любое время в рубине? – SundayMonday

ответ

4
Proc.new ...    # create a new proc 

Proc.new{ |a| ... }  # a new proc that takes a single param and names it "a" 

Proc.new do |a| ... end # same thing, different syntax 

Proc.new do |a| 
    a.something "test"  # invoke "something" method on "a", passing a string 
    puts a.something  # invoke the "something" method on "a" with no params 
         # and then output the result as a string (call to_s) 
    puts "hello"   # output a string 
end 

Поскольку последнее выражение в прок является puts, который всегда возвращает nil, возвращаемое значение ргос , если она когда-либо вызван будет nil.

irb(main):001:0> do_it = Proc.new{ |a| a.say_hi; 42 } 
#=> #<Proc:[email protected](irb):1> 

irb(main):002:0> class Person 
irb(main):003:1> def say_hi 
irb(main):004:2>  puts "hi!" 
irb(main):005:2> end 
irb(main):006:1> end 

irb(main):007:0> bob = Person.new 
#=> #<Person:0x2c1c168> 

irb(main):008:0> do_it.call(bob) # invoke the proc, passing in bob 
hi! 
#=> 42       # return value of the proc is 42 

irb(main):009:0> do_it[bob]  # alternative syntax for invocation 
hi! 
#=> 42 
+0

Это отличный пример, спасибо. Интересный вопрос о возвращаемом значении (42 в вашем примере). – SundayMonday

+1

@SundayMonday «Возвращаемое значение» любого блока (и метода и оператора) всегда является значением последнего выражения в инструкции. – Phrogz

+2

Еще один синтаксис для вызова lamba/proc: 'do_it. (Bob)'. –

Смежные вопросы