您需要了解该方法的*
作用。1 . 这取决于方法的接收者。对于"cat".*(3)
,"cat"
是*
的接收者。因为1.*(3)
(后面会解释,可以写成1*3
)1
是*
的接收者。术语“接收者”源自 OOP 向接收者发送消息(方法)的概念。
可以以两种方式之一在对象(例如,"cat"
或)上定义方法。1
最常见的是该方法是定义在接收者的类上的实例方法*
(例如,定义在"cat".class #=> String
or上1.class #=> Integer
。第二种方式在这里不适用,即该方法已定义在对象的单例类上,前提是对象具有一。("cat"
有一个单例类1
,但作为立即值,没有。)
因此,当我们看到"cat".*(3)
时,我们查看文档中的String#*并得出结论:
"cat".*(3) #=> "catcatcat"
对于1*(3)
,我们查看Integer#*,它告诉我们
1.*(3) #=> 3
让我们尝试另一个:[1,2,3].*(3)
,因为[1,2,3].class #=> Array
我们查看Array#*并得出结论
[1,2,3].*(3) #=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
请注意,此方法有两种形式,具体取决于其参数是整数(如此处)还是字符串。在后一种情况下
[1,2,3].*(' or ') #=> "1 or 2 or 3"
许多方法具有不同的行为,这取决于其参数(以及是否提供了可选块)。
最后,Ruby 允许我们使用这三种方法的简写(以及某些名称由非字母、数字或下划线字符组成的其他方法。):
"cat"*3 #=> "catcatcat"
"cat" * 3 #=> "catcatcat"
1*3 #=> 3
[1,2,3] * 3 #=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
这种速记通常被称为“语法糖”。
1 Ruby 的方法名不限于单词,如“map”、“upcase”等。例如,“*”、“~”、“[]”和“[]=”是有效的方法名称”