Ruby 召唤二传手和接球手
我有一个setter和一个getter方法,用于classRuby 召唤二传手和接球手,ruby,Ruby,我有一个setter和一个getter方法,用于classBook上的属性:isbn: class Book attr_accessor :isbn end book01 = Book.new book01是Book的一个实例: class Book attr_accessor :isbn end book01 = Book.new 设置实例属性时,以下哪种方法是首选方法 book01.isbn=("9876") book01.isbn= "9876" book01.isbn =
Book
上的属性:isbn
:
class Book
attr_accessor :isbn
end
book01 = Book.new
book01
是Book
的一个实例:
class Book
attr_accessor :isbn
end
book01 = Book.new
book01.isbn=("9876")
book01.isbn= "9876"
book01.isbn = "9876"
book01.isbn("9876")
# => ArgumentError: wrong number of arguments (1 for 0)
book01.isbn=("9876")
book01.isbn= "9876"
book01.isbn = "9876"
最后两个例子是“语法糖”,从技术上讲,这些东西在语法上是不正确的,但保留在语言中,因为它们使代码更干净。第一个例子是如果Ruby不支持语法糖,那么唯一可行的方法。为什么?
因为引擎盖后面的attr_accessor:isbn为您创建了以下代码:
def isbn
@isbn
end
def isbn=(new_isbn)
@isbn = new_isbn
end
这是两种完全不同的方法,这可能会令人困惑,因为名称上唯一的区别是=符号。但这并不意味着什么,也不能改变它们是完全不同的方法这一事实。
因此:
book01.isbn=("9876")
实际上,您正在调用def isbn=(new_isbn),这是一个方法,仅此而已。以及:
book01.isbn= "9876"
book01.isbn = "9876"
您只是调用了相同的方法,只是使用了“语法糖”。在引擎盖后面,Ruby将所有这2项视为:
book01.isbn=("9876")
你能猜出为什么这个代码不起作用吗
book01.isbn("9876")
因为,正如我们前面看到的,在幕后Ruby创建了两个方法。第一个方法不接受任何参数,因此,您得到了您得到的错误(Ruby只是告诉您,我期望0个参数,而您提供了1个,因此我提出了ArgumentError)。我希望我不再对此感到困惑。我将等号视为方法调用,而不是实际方法名称的一部分。例如,在
book01.isbn
中,点是“book01”上的方法,因此我认为“isbn”上的等号也是方法调用isbn=
,而不是方法名称的一部分。正确吗?是的,正确,isbn和isbn=是不同的方法名,就像猫和狗一样。