当我输入
digicollect=[]
digicollect[0]=2
当我在irb中键入digicollect时,我得到2。
另外,当我输入
时"Hello" * 2
我得到“HelloHello”
但如果我输入
2 * "Hello"
它不起作用。
"hello" * digicollect
不起作用。 但是
"hello" * digicollect[0]
确实有效。
为什么呢?
答案 0 :(得分:0)
我应该在前言中说我在irb中输入2
时没有得到digicollect
...我得到[2]
。这是一个值为2的单个元素数组。这与整数值2非常不同。
String对于数组参数没有*
运算符,并且number没有带有字符串参数的*
运算符。但是,String的*
带有数字参数,digicollect[0]
访问该数组元素的数值。
答案 1 :(得分:0)
ruby中的所有东西都是一个对象,甚至乘法也只是方法调用。
"Hello" * 2
与"Hello".*(2)
所以当你得到一个错误时,你应该问自己:左手边是否真的有乘法方法,它会接受右手作为参数吗?
digicollect = []
digicollect[0] = 2
让我们检查一下我们拥有的对象:
p digicollect.class #=> Array
p digicollect[0].class #=> Fixnum
p 2.class #=> Fixnum
p "Hello".class #=> String
现在,如果我们进入* -method的文档,我们会找到每个类所期望的内容:
http://ruby-doc.org/core-2.1.0/String.html#method-i-2A
http://ruby-doc.org/core-2.1.0/Array.html#method-i-2A
http://ruby-doc.org/core-2.1.0/Fixnum.html#method-i-2A
在那里,我们发现会发生什么:
因此,当您编写"hello" * digicollect
时,您试图调用sting的乘法方法并将其传递给Array,并且该方法根本不知道如何处理它(它只接受整数),即为什么你得到错误。
答案 2 :(得分:-1)
digicollect本身不是数字,这就是为什么你不能“乘以”它。它包含数字,这就是为什么“hello”* digicollect [0]有效。
对于2 *“Hello”的情况,我认为这是关于语言的语法问题 - 字符串必须是第一个,整数是第二个。