yield self和yield之间的区别是什么?

13

请问有谁能帮我理解"yield self"和"yield"之间的区别吗?

class YieldFirstLast
    attr_accessor :first, :last

    def initialize(first = nil, last = nil)
        @first = first
        @last = last
        yield self if block_given?
    end

    def hello
        puts "#{@first} #{@last} says hello!"
    end
end
3个回答

21
yield self的情况下,self是传递给块的参数。如果只是简单地使用yield,则不会传递任何参数。这里的self并不特殊,任何东西都可以被yield,例如:
class Foo
  def a() yield self end
  def b() yield end
  def c() yield "Bar" end
  def d() yield 1, 2, "scuba" end
  def to_s() "A!" end
end

Foo.new.a {|x| puts x } #=> A!
Foo.new.b {|x| puts x } #=> (a blank line, nil was yielded)
Foo.new.c {|x| puts x } #=> Bar
Foo.new.d {|x, y, z| puts z } #=> scuba

如果块传递了多个参数怎么办?Self 是否是它们的数组? - oldergod
2
self 是一个指向实例的引用,但像我说的那样,这里没有什么特别的。本质上,将 yield 视为一个方法,它接受任何参数并将它们传递给块。有关多个参数,请参见编辑。 - numbers1311407
谢谢您的解释。让我确认一下我的理解,当我们使用self时,x被分配为当前对象的引用。但是如果我们不使用self,x就不会被分配给任何对象。 - vivek kumar
是的,将块视为方法,yield作为该方法的调用可能会有所帮助。块{|x, y| x + y }类似于def fn(x, y) x + y end。如果您不使用参数调用fn(),您会期望在方法体中未定义x,对吗? - numbers1311407

5

yield self 进入与方法调用相关联的块,将当前对象作为参数传递给该块,而普通的 yield 则只是进入该块而不传递任何参数。


2

yield看作是调用你的块,而yield self则是以当前实例作为参数调用你的块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接