下面的代码;这是教科书中的一个例子。问题:
为什么会“放10.miles.back”?由于该行位于Numeric类之外,因此它不应该是“ puts Numeric.10.miles.back”吗?
我已经读到“ self”是指包含的类。那么,它在这里看起来像是一个数字呢?
如果我从第一个调用的方法中删除“ self *”,则代码似乎仍然完全一样。那在那里做什么?
我似乎无法将这些方法中的任何一种转换为接受参数的普通方法。它会输出一条错误消息,报告该方法未定义。
我猜想number.method是一种传递参数的方法。这种语法叫什么?
class Numeric
def inches
self
end
def feet
self * 12.inches
end
def yards
self * 3.feet
end
def miles
self * 5280.feet
end
def back
self * -1
end
def forward
self
end
end
puts 10.miles.back
答案 0 :(得分:3)
在ruby中,基本上所有东西都是一个类的实例。在这种情况下,数字文字是Numeric
的实例。这段代码重新打开了该类并为其添加了方法。这将为程序中的所有数字提供这些方法。
否。 10
是Numeric
的实例,因此刚刚添加了所有公共方法,包括miles
方法。 10.miles
调用您刚刚添加的miles
的{{1}}方法。
“我已经读过'自我'是指包含类。” 这是不正确的。 10
指正在执行其方法的对象。当您调用self
时,它将在字符串对象上调用"a,b,c".split(',')
方法,并且在该方法split
内将引用字符串self
。
第一种方法中没有"a,b,c"
,但是如果您是指self *
中的self *
,那么它只是乘法。请记住,这些方法中的def miles
是一个数字。因此self
的结果为10.miles
,该结果返回一个代表10英里的数字。
添加一个参数应该可以正常工作,只要您在调用它时提供一个参数即可:
10 * 5280.feet
class Numeric
def miles(arg)
puts "got an arg #{arg}"
self * 5280.feet
end
end
10.miles("some argument")
是调用(或调用)方法的一种方式。 number.method
之所以有效,是因为您在数字10.miles.back
上调用了miles
方法,该方法返回了另一个数字。然后,您可以在该号码上调用10
方法。