Ruby方法定义

时间:2013-10-23 17:30:37

标签: ruby-on-rails ruby

所以我写了一个简单的产品类并从类中实例化。

#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)”有点令人困惑,因为我是根据在线研究和书籍编写的,但如果我能对此有所澄清,那将会有所帮助。

3 个答案:

答案 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

并且不执行任何实际的任务。