所以我写了一个简单的产品类并从类中实例化。
#This class defines a product
#It provides a method that can be used to provide a discount on any given instance of a product
class Product
attr_reader :name, :description, :price
def initialize (name, description, price)
@name = name
@description = description
@price = Float(price)
end
def price=(sale_price)
@price = sale_price
end
def to_s
"Name: #{@name}, Description: #{@description}, Price: #{@price}."
end
end
my_product = Product.new("redshoes","These are beautiful",50.00)
my_product.price = my_product.price * 0.50
puts "The new sale price of #{my_product.name} is #{my_product.price}"
我有一个问题需要澄清,那就是我定义这样的方法:
def price=(sale_price)
@price = sale_price
end
我正在定义方法并同时将其分配给变量。第一行“def price =(sale_price)”有点令人困惑,因为我是根据在线研究和书籍编写的,但如果我能对此有所澄清,那将会有所帮助。
答案 0 :(得分:1)
这只是方法名称。
def set_price(p)
@price = p
end
或:
def price=(p)
@price = p
end
你这样称呼:
product.set_price(100)
product.price=(100)
请参阅?没变。当Ruby允许你省略parens并在名字的其余部分和其他部分之间添加空格时,魔术就出现了:
product.price = 100
这只是一种常用的方法调用。没什么好看的。
答案 1 :(得分:1)
我认为如果你理解def
实际上在做什么会更有意义。在您的def price=(sale_price)
示例中,“price =”是您在Product类上定义的方法的名称。当您拨打my_product.price =
时,您正在调用您定义的名为“price =”的方法。
在将实例变量@price
设置为等于方法输入(变量sale_price
)之前,实际上不会更改任何值。
my_product.price
(没有等号)的原因是因为您使用:price
定义了一个名为attr_reader :price
的属性,这是一种有用的方式,可以让您对实例变量@price
。
希望有所帮助。
答案 2 :(得分:0)
这是ruby做setter方法的方式。请记住,不要求方法名称和变量名称匹配,也不要求实际发生任何分配,尽管这在大多数情况下可能都是很好的做法。
但你可以:
def confuse=(ignore_me)
puts "Silly human, #{ignore_me} is being ignored!"
end
,只要你有
就会被调用object.confuse = something
并且不执行任何实际的任务。