1

私は次のコードに戸惑っています:

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

    puts a.something
    puts "hello"
end

実行時にエラーはスローされません。putsただし、どちらのステートメントにも何も出力されません。a.something「割り当て」に興味があります。おそらくこれは、parensが省略されたメソッド呼び出しです。上記のコードで何が起こっていますか?

4

1 に答える 1

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

proc の最後の式はputs常に を返すため、呼び出された場合nilの proc の戻り値は になります。nil

irb(main):001:0> do_it = Proc.new{ |a| a.say_hi; 42 }
#=> #<Proc:0x2d756f0@(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
于 2012-04-10T21:25:40.383 に答える