Ruby: 什么时候用 self 什么时候不用?
Ruby: When to use self and when not to?
我明白 Ruby self 的意思,我正试图解决 Tealeaf 上的某些挑战:http://www.gotealeaf.com/books/oo_workbook/read/intermediate_quiz_1
这是实际问题:
片段 1:
class BankAccount
def initialize(starting_balance)
@balance = starting_balance
end
# balance method can be replaced with attr_reader :balance
def balance
@balance
end
def positive_balance?
balance >= 0 #calls the balance getter instance level method (defined above)
end
end
现在对于代码段 1,运行 此代码:
bank_account = BankAccount.new(3000)
puts bank_account.positive_balance?
在控制台上打印 true,而对于片段 2:
片段 2:
class InvoiceEntry
attr_reader :product_name
def initialize(product_name, number_purchased)
@quantity = number_purchased
@product_name = product_name
end
# these are attr_accessor :quantity methods
# quantity method can be replaced for attr_reader :quantity
def quantity
@quantity
end
# quantity=(q) method can be replaced for attr_writer :quantity
def quantity=(q)
@quantity = q
end
def update_quantity(updated_count)
# quantity=(q) method doesn't get called
quantity = updated_count if updated_count >= 0
end
end
现在对于片段 2,运行 此代码:
ie = InvoiceEntry.new('Water Bottle', 2)
ie.update_quantity(20)
puts ie.quantity #> returns 2
为什么这不更新值?
为什么它适用于第一种情况而不适用于第二种情况?
您正在向 quantity
局部变量赋值。
如果你想分配给实例变量(通过你的 def quantity=
函数)你需要做
self.quantity = updated_count if updated_count >= 0
本质上,您是在 self
.
上进行函数调用 (quantity=
)
在片段 1 中,balance
是一个纯函数调用,因为没有进行赋值。
我明白 Ruby self 的意思,我正试图解决 Tealeaf 上的某些挑战:http://www.gotealeaf.com/books/oo_workbook/read/intermediate_quiz_1
这是实际问题:
片段 1:
class BankAccount
def initialize(starting_balance)
@balance = starting_balance
end
# balance method can be replaced with attr_reader :balance
def balance
@balance
end
def positive_balance?
balance >= 0 #calls the balance getter instance level method (defined above)
end
end
现在对于代码段 1,运行 此代码:
bank_account = BankAccount.new(3000)
puts bank_account.positive_balance?
在控制台上打印 true,而对于片段 2:
片段 2:
class InvoiceEntry
attr_reader :product_name
def initialize(product_name, number_purchased)
@quantity = number_purchased
@product_name = product_name
end
# these are attr_accessor :quantity methods
# quantity method can be replaced for attr_reader :quantity
def quantity
@quantity
end
# quantity=(q) method can be replaced for attr_writer :quantity
def quantity=(q)
@quantity = q
end
def update_quantity(updated_count)
# quantity=(q) method doesn't get called
quantity = updated_count if updated_count >= 0
end
end
现在对于片段 2,运行 此代码:
ie = InvoiceEntry.new('Water Bottle', 2)
ie.update_quantity(20)
puts ie.quantity #> returns 2
为什么这不更新值? 为什么它适用于第一种情况而不适用于第二种情况?
您正在向 quantity
局部变量赋值。
如果你想分配给实例变量(通过你的 def quantity=
函数)你需要做
self.quantity = updated_count if updated_count >= 0
本质上,您是在 self
.
quantity=
)
在片段 1 中,balance
是一个纯函数调用,因为没有进行赋值。