1

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

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

4

3 回答 3

1

这只是方法名称。

def set_price(p)
  @price = p
end

或者:

def price=(p)
  @price = p
end

你这样称呼:

product.set_price(100)
product.price=(100)

看?没变。当 Ruby 允许您省略括号并在等号和名称的其余部分之间添加空格时,魔法就出现了:

product.price = 100

这只是一个常用的方法调用。没什么好看的。

于 2013-10-23T17:44:38.877 回答
1

def我认为如果您了解实际在做什么,这将更有意义。在您的示例中def price=(sale_price),“price=" 是您在 Product 类上定义的方法的名称。当您调用 时my_product.price =,您调用的是您定义的名为“price=”的方法。

@price在将实例变量设置为等于方法的输入(变量)之前,您实际上不会更改任何值sale_price

原因my_product.price(没有等号)有效是因为您已经定义了一个名为:priceusing的属性attr_reader :price,这是一种让您可以读取实例变量的有用方法@price

希望有帮助。

于 2013-10-23T17:46:07.720 回答
0

这就是 ruby​​ 执行 setter 方法的方式。请记住,不需要方法名称和变量名称匹配,也不需要实际发生任何赋值,尽管大多数情况下这可能是一种很好的做法。

但你可以:

def confuse=(ignore_me)
    puts "Silly human, #{ignore_me} is being ignored!"
end

任何时候都会调用它

object.confuse = something

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

于 2013-10-23T17:41:50.487 回答