在带有参数 `&block` 的方法中使用 `yield self` 和在没有参数 `&block` 的方法中使用 `yield self` 有什么不同吗?
Is there any difference in using `yield self` in a method with parameter `&block` and `yield self` in a method without a parameter `&block`?
我明白
def a(&block)
block.call(self)
end
和
def a()
yield self
end
导致相同的结果,如果我假设有这样一个块a {}
。我的问题是 - 因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用 variable/reference 块):
def a(&block)
yield self
end
这是一个具体案例,我不明白&block
的用法:
def rule(code, name, &block)
@rules = [] if @rules.nil?
@rules << Rule.new(code, name)
yield self
end
我能想到的唯一优点就是自省:
def foo; end
def bar(&blk); end
method(:foo).parameters #=> []
method(:bar).parameters #=> [[:block, :blk]]
IDE 和文档生成器可以利用这一点。但是,它不影响Ruby的参数传递。调用方法时,无论是声明还是调用,都可以传递或省略块。
两者的主要区别
def pass_block
yield
end
pass_block { 'hi' } #=> 'hi'
和
def pass_proc(&blk)
blk.call
end
pass_proc { 'hi' } #=> 'hi'
是,blk
,Proc
的实例,是一个对象,因此可以传递给其他方法。相比之下,块不是对象,因此不能传递。
def pass_proc(&blk)
puts "blk.is_a?(Proc)=#{blk.is_a?(Proc)}"
receive_proc(blk)
end
def receive_proc(proc)
proc.call
end
pass_proc { 'ho' }
blk.is_a?(Proc)=true
#=> "ho"
我明白
def a(&block)
block.call(self)
end
和
def a()
yield self
end
导致相同的结果,如果我假设有这样一个块a {}
。我的问题是 - 因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用 variable/reference 块):
def a(&block)
yield self
end
这是一个具体案例,我不明白&block
的用法:
def rule(code, name, &block)
@rules = [] if @rules.nil?
@rules << Rule.new(code, name)
yield self
end
我能想到的唯一优点就是自省:
def foo; end
def bar(&blk); end
method(:foo).parameters #=> []
method(:bar).parameters #=> [[:block, :blk]]
IDE 和文档生成器可以利用这一点。但是,它不影响Ruby的参数传递。调用方法时,无论是声明还是调用,都可以传递或省略块。
两者的主要区别
def pass_block
yield
end
pass_block { 'hi' } #=> 'hi'
和
def pass_proc(&blk)
blk.call
end
pass_proc { 'hi' } #=> 'hi'
是,blk
,Proc
的实例,是一个对象,因此可以传递给其他方法。相比之下,块不是对象,因此不能传递。
def pass_proc(&blk)
puts "blk.is_a?(Proc)=#{blk.is_a?(Proc)}"
receive_proc(blk)
end
def receive_proc(proc)
proc.call
end
pass_proc { 'ho' }
blk.is_a?(Proc)=true
#=> "ho"