Ruby: 实例方法的"If"语句里面的"Self"是什么

Ruby: What is "Self" inside "If" Statement of Instance Method

当"self"在实例方法中的"if"语句(或称为块?)中时,"self"指的是什么?

我在最后一个方法中指的是我的代码:“apply_discount

我以为它会给我 @total 和 @discount 实例变量,但它没有这样做

我假设它是 "if" 语句本身或者方法本身,因为它没有按照我的预期进行。

所以,基本上,我如何通过使用 "self" 从我在 "if" 语句中的位置获取这些变量?

或者我应该使用其他方式?

class CashRegister

    attr_accessor :total, :discount

    def initialize(discount = 0)
        @total = 0
        @discount = discount
    end

    def add_item(title, price, quantity = 0)
        if quantity > 0
            self.total += (price * quantity)
        else
            self.total += price
        end
    end

    def apply_discount
        # total = self.total
        # discount = self.discount
        if self.discount > 0
            self.total = self.total - (self.total * (self.discount / 100.0))
            "After the discount, the total comes to $#{self.total}."
        else
            "There is no discount to apply."
        end
    end
end

感谢您的帮助!

它总是指同样的东西,调用该方法的对象。您的代码工作正常。

cr = CashRegister.new(10)
cr.add_item("Sporkle", 10, 2)
cr.add_item("Glagnar's Human Rinds", 15, 1)
puts cr.total     # 35
cr.apply_discount
puts cr.total     # 31.5

附带说明一下,您可以简化代码以添加项目,无需对单个项目进行特殊处理; anything * 1anything。 0 也是一个奇怪的默认值,什么都不添加几乎不是你想要的,将它设为默认值会隐藏错误。要么删除默认值,要么使其变得有用,例如 1.

def add_item(title, price, quantity = 1)
    self.total += price * quantity
end

关键字self指的是对象本身的实例,本例中的对象是CashRegister。构造函数方法 initialize 设置实例变量(@ 表示实例变量),而 attr_accessor 设置允许您在对象中使用 self.variable 的增变器和访问器方法直接从对象写入和检索这些变量,例如 cashregister.total 会给出您设置的任何内容

从顶部删除 attr_accessor 会出现以下错误:

:12:in `add_item': undefined method `total' for #<CashRegister:0x00000001b77c98 @total=0, @discount=10> (NoMethodError)
        from answer.rb:32:in `<main>'

这个概念叫做"encapsulation"。对象内的变量是该对象私有的,您需要一个特定的方法来更改和检索它们。

attr_accessor快捷方式也可以写成下面的事情:

class CashRegister

def initialize(discount = 0)
    @total = 0
    @discount = discount
end

def total #accessor
  @total
end

def total=(value) #mutator
  @total=value
end

def discount #accessor
  @discount
end

def discount=(value) #mutator
  @discount=value
end

def add_item(title, price, quantity = 0)
    if quantity > 0
        self.total += (price * quantity)
    else
        self.total += price
    end
end

def apply_discount
    # total = self.total
    # discount = self.discount
    if self.discount > 0
        self.total = self.total - (self.total * (self.discount / 100.0))
        "After the discount, the total comes to $#{self.total}."
    else
        "There is no discount to apply."
    end
end

结束

希望对你有所帮助。