【问题标题】:Difference between yield self and yield?收益自我和收益之间的区别?
【发布时间】:2012-08-15 11:11:32
【问题描述】:

谁能帮我理解“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

【问题讨论】:

    标签: ruby yield self


    【解决方案1】:

    yield 视为调用您的块,而yield self 使用当前实例作为参数调用您的块。

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 如果有多个参数传递给块怎么办? Self 是它们的数组吗?
      • self 是对实例的引用,但就像我说的,这里没什么特别的。从本质上讲,yield 是一种接受任何参数并将它们传递给块的方法。查看多个参数的编辑。
      • 感谢您的解释。让我检查一下我的理解,所以当我们使用 self 时,x 被分配为当前对象引用。但是如果我们不使用 self,x 就不会分配给任何对象。
      • 是的,将块视为一种方法可能会有所帮助,而将yield 视为该方法的调用。块{|x, y| x + y } 类似于def fn(x, y) x + y end。如果您在没有参数的情况下调用fn fn(),您会期望x 在方法主体中未定义,是吗?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-07-03
        • 2019-09-19
        • 2014-03-21
        • 2015-10-11
        • 2018-08-15
        • 2019-08-07
        • 2020-07-22
        • 2011-01-13
        • 2010-12-21
        相关资源
        最近更新 更多