【问题标题】:Ruby Method Chaining (beginner)Ruby 方法链(初学者)
【发布时间】:2017-11-08 14:23:13
【问题描述】:

我写了下面的代码:

class Pet
  attr_accessor :breed, :name, :weight

  def initialize(breed, name, weight)
    @breed = breed
    @name = name
    @weight = weight
  end

  def show_pet
    p "Your pet is a #{@breed}, and their name is #{@name}. They weigh #{@weight} lbs."
  end

  def set_weight(weight)
    @weight += weight
    self
  end
end

pet1 = Pet.new("Chihuahua", "Jill", 5)
pet1.set_weight(5).show_pet

但我并不完全理解它是如何工作的,主要是 self 部分。我希望有人能指出我对方法链接的一个很好的解释。

【问题讨论】:

  • 返回self 是提供fluent interface 的一种方式。它允许您通过链接方法调用将多个方法发送到同一个接收者。

标签: ruby method-chaining


【解决方案1】:

如果您是初学者,有几件事需要考虑。

方法中的最后一个值调用是方法的返回值。在你的例子中:

def set_weight(weight)
    @weight += weight
    self
end

相当于:

def set_weight(weight)
    @weight += weight
    return self # <- with return
end

那么,关于self,如果你习惯了其他语言,你可能见过this这个关键字,它是等价的。 它是您当前使用的类的实例的引用。

当您返回 self 时,您可以像这样链接调用:

rex_the_dog = Pet.new nil, 'rex', 20 #create rex_the_dog an instance of Pet
rex_the_dog.set_weight(3).set_weight(2) #As you return self, you can chain call like this
rex_the_dog.weight #return 25  (20 : set on init + 2 : first set_weight call + 3 : second set_weight call)

【讨论】:

    【解决方案2】:

    show_petPet 的实例方法(就像set_weight),所以它只能在Pet 的实例上调用。当您想在set_weight 之后调用此方法时,set_weight 需要返回调用它的Pet 的实例。

    self 是您在set_weight(weight) 中设置的返回值,在实例方法中,这是对您正在调用该方法的Pet 实例的引用。因此,每当Pet 的实例调用该方法时,它都会返回实例本身。

    为了更清楚地看到这一点,您可以通过以下方式进行一些实验:

    class Pet 
      ...
      def return_instance
        self
      end
    end
    
    pet1 = Pet.new('Chihuaha', 'Jill', 5)
    pet1 == pet1.return_instance # => true
    

    【讨论】:

      【解决方案3】:

      在您的示例中,@weight 是一个实例变量,而 set_weight 是一个实例方法,它为实例变量 @weight 添加权重。
      self 返回具有更新的 @weight 的类的实例.

      然后在返回的实例上调用 show_pet 方法并打印其值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        相关资源
        最近更新 更多