试着在Ruby中设置实例变量

时间:2011-12-23 13:13:04

标签: ruby

我正在通过阅读 Programming Ruby,实用程序员指南来学习Ruby。我真的很喜欢语法的简洁。

我无法理解=在setter方法名称中的作用:

def price=(new_price)
    @price = new_price
end

该功能定义与此有何不同:

def price(new_price)

=有何不同?这本书说它可以直接分配。但是,使用普通的setter方法已经不可能没有= ......?

这是课程的其余部分:

class BookInStock
    attr_reader    :isbn
    attr_accessor  :price

    def initialize(isbn, price)
        @isbn = isbn
        @price = Float(price)
    end
end

book.price = book.price * 0.75

1 个答案:

答案 0 :(得分:5)

它为您提供了编写代码的'语法糖',如下所示:

class Book
    price=(new_price)
       @price = new_price
       # do something else
    end
end

book = Book.new

book.price = 1

此代码将翻译为

book.price=(1)

实际上,attr_writerattr_accessor方法会为您的班级生成 setter price=)方法(attr_readerattr_accessor生成< em> getter 方法。)所以你的BookInStock类类似于:

class BookInStock
    def isbn val
        @isbn = val
    end

    def price val
        @price
    end
    def price= val
        @price = val
    end

    def initialize(isbn, price)
        @isbn = isbn
        @price = Float(price)
    end
end

只有在要添加一些逻辑(如验证)时,才需要使用=编写方法。在其他情况下,只需使用attr_writerattr_accessor