我刚刚完成了Ruby Koans,使用Object.send调用方法的单元和方法上的Ruby文档都没有提供有关在send方法中使用块的任何信息.将附加到send方法的块传递给它调用的方法,还是块会丢失?
例:
foo.send(:a_method) { bar.another_method }
Run Code Online (Sandbox Code Playgroud)
mu *_*ort 21
该文件是在这个有点不清楚:
发送(符号[,args ...])→obj
调用由symbol标识的方法,并将指定的任何参数传递给它.
但请注意指定部分的任何参数.您为方法提供的块实际上是一个有趣的隐式参数类型,因此您可以执行以下操作:
def m(&b)
@a.each(&b)
end
m { |e| puts e }
Run Code Online (Sandbox Code Playgroud)
将块作为Proc实例传递.但是,您也可以这样做:
def m
yield
end
m { puts 'pancakes' }
Run Code Online (Sandbox Code Playgroud)
因此,就参数列表而言,该块是特殊的,但即使有时是隐式的,该块仍然表现为参数.
鉴于上面的"块是一种论证"漫无目的以及Ruby中块的重要性,send通过该块是合理的.你也可以尝试一下,但是你必须小心使用"试一试"方法进行偶然和无证的行为:
class C
def m
yield
end
end
o = C.new
o.send(:m) { puts 'pancakes' }
# "pancakes" comes out
Run Code Online (Sandbox Code Playgroud)
Mic*_*ese 14
是.考虑以下:
class A
def explicit(&b); b; end
def implicit; yield "hello"; end
end
>> A.new.send(:explicit) { }
=> #<Proc:0x0000000000000000@(irb):19>
>> A.new.send(:implicit) { |greeting| puts greeting }
hello
=> nil
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
是的,它会。在方法内部,您可以使用进行检查并使用block_given?调用块yield
class Foo
def bar
puts "before yield"
yield if block_given?
puts "after yield"
end
end
f = Foo.new
f.send(:bar)
puts ""
f.send(:bar) { puts "yield"}
Run Code Online (Sandbox Code Playgroud)
before yield
after yield
before yield
yield
after yield
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9538 次 |
| 最近记录: |