这可能不是你应该在家里尝试的东西,但由于某种原因我试图在Ruby中创建一个方法数组.
我开始定义两种方法.
irb(main):001:0> def test1
irb(main):002:1> puts "test!"
irb(main):003:1> end
=> nil
irb(main):004:0> def test2
irb(main):005:1> puts "test2!"
irb(main):006:1> end
=> nil
Run Code Online (Sandbox Code Playgroud)
当你试图把它放到一个实际的数组中时会发生奇怪的事情.它似乎运行两种方法.
irb(main):007:0> array = [test1, test2]
test!
test2!
=> [nil, nil]
Run Code Online (Sandbox Code Playgroud)
然后,阵列是空的.
irb(main):008:0> puts array
=> nil
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么它运行这些方法?除此之外,整个运动是否真的需要一个驱魔人?
Lar*_*eth 21
你在数组中存储的是调用方法的结果,而不是方法本身.
def test1
puts "foo!"
end
def test2
puts "bar!"
end
Run Code Online (Sandbox Code Playgroud)
您可以存储对实际方法的引用,如下所示:
> arr = [method(:test1), method(:test2)]
# => [#<Method: Object#test1>, #<Method: Object#test2>]
Run Code Online (Sandbox Code Playgroud)
稍后,您可以像这样调用引用的方法:
> arr.each {|m| m.call }
foo!
bar!
Run Code Online (Sandbox Code Playgroud)
@alestanis 很好地解释了原因。如果您试图存储这些方法,那么您可以按照 Lars Haugseth 所说的进行操作,也可以执行以下操作:
test1 = Proc.new { puts "test!" }
test2 = Proc.new { puts "test2!" }
a = [test1, test2]
Run Code Online (Sandbox Code Playgroud)
这可能会使您的代码更具可读性。
这是一个 irb 运行。
1.9.3p194 :009 > test1 = Proc.new { puts "test!" }
=> #<Proc:0x00000002798a90@(irb):9>
1.9.3p194 :010 > test2 = Proc.new { puts "test2!" }
=> #<Proc:0x00000002792988@(irb):10>
1.9.3p194 :011 > a = [test1, test2]
=> [#<Proc:0x00000002798a90@(irb):9>, #<Proc:0x00000002792988@(irb):10>]
Run Code Online (Sandbox Code Playgroud)