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 * 1
是 anything
。 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
结束
希望对你有所帮助。
当"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 * 1
是 anything
。 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
结束
希望对你有所帮助。