当我输入以下内容时:
print "2+2 is equal to" +2+2
我收到一条错误消息,说我无法将数字转换为字符串,但是当我输入时:
print "2+2 is equal to", 2+2
它正在接受并显示:
2+2 is equal to4
两者有什么区别?这对我来说没有逻辑意义。有人可以解释一下吗?
答案 0 :(得分:3)
print "2+2 is equal to" + 2 + 2
在这里,您尝试向字符串添加数字。这个操作没有意义。这就像给猫加一个苹果。添加失败,但如果成功,则print
将打印结果。
print "2+2 is equal to", 2 + 2
在这里,您告诉print
命令打印此字符串,以及对这两个数字求和的结果。它知道如何打印字符串以及如何打印数字。在这种情况下,字符串和数字不必混合在一起,它们是分开处理的。这就是为什么这个操作成功的原因。
您也可以进行第一次操作。为此,您必须明确表示您希望将此数字作为字符串,以便两个加法操作数都是字符串,并且可以实际添加在一起。
print "2+2 is equal to" + (2 + 2).to_s
或
print "2+2 is equal to #{2 + 2}" # this is called string interpolation
有些语言会尝试友好,如果您在字符串中添加数字,则会为您编号。结果可能......令人惊讶。
Javascript:
"2 + 2 equals to " + 2 + 2
# => "2 + 2 equals to 22"
"2 + 2 equals to " + (2 + 2)
# => "2 + 2 equals to 4"
红宝石不做这种伎俩是好的:)
答案 1 :(得分:1)
每个人都指出print
是如何运作的,所以我想我会对+
有所了解。
这两个操作符看起来一样,对吧?
'2'+'2'
2+2
实际上,发生了两种非常不同的操作:
因此,如果String#+仅适用于string
个对象,那么我们如何打印不同类型的对象呢?
某些类非常“类似字符串”,并且可以在大多数情况下被视为字符串(例如,在Ruby 1.9之前的Exception
),因为它们实现了to_str
(隐式转换)。
我们还可以在自己的对象中实现to_s
,以允许它返回对象的String
表示(显式转换)。
您可以在http://codeloveandboards.com/blog/2014/03/18/explicit-vs-implicit-conversion-methods/
了解详情答案 2 :(得分:0)
print "2+2 is equal to" +2+2
相当于:
print("2+2 is equal to" +2+2)
您正尝试将整数2
添加到字符串"2+2 is equal to"
。
print "2+2 is equal to", 2+2
相当于:
print("2+2 is equal to", 2+2)
这里print
需要两个争论,一个是字符串,另一个是表达式2+2
。
答案 3 :(得分:0)
print "2+2 is equal to" + 2+2
失败,因为它尝试在将结果发送到print
之前向字符串添加整数。一项没有意义的操作。鉴于:
print "2+2 is equal to", 2+2
是另一项操作。在这里,您向print
发送两个参数。一个字符串和一个整数。内部print
在两个值上调用to_s
。
print(obj, ...)
→nil
依次将每个对象打印到
$stdout
。 [...]不是字符串的对象将通过调用to_s
方法进行转换。
另一种方法是字符串插值,它也会自动调用to_s
:
print "2+2 is equal to #{2+2}"