Разница между урожайностью и урожайностью?

Может ли кто-нибудь помочь мне разобраться в различии между "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

Ответ 1

В случае yield self, self - это аргумент, переданный блоку. Просто yield аргумент не передается. self здесь не является чем-то особенным, что-то может быть достигнуто, например

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

Ответ 2

yield self вводит блок, связанный с вызовом метода, передавая текущий объект в качестве аргумента блоку, plain yield просто входит в блок без передачи каких-либо аргументов.

Ответ 3

Вспомните yield как вызов вашего блока, а yield self вызывает ваш блок с текущим экземпляром в качестве параметра.