数字vs字符串/表达式与值

时间:2015-04-19 12:13:08

标签: ruby

当我输入以下内容时:

print "2+2 is equal to" +2+2

我收到一条错误消息,说我无法将数字转换为字符串,但是当我输入时:

print "2+2 is equal to", 2+2

它正在接受并显示:

2+2 is equal to4

两者有什么区别?这对我来说没有逻辑意义。有人可以解释一下吗?

4 个答案:

答案 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是如何运作的,所以我想我会对+有所了解。

这两个操作符看起来一样,对吧?

  1. '2'+'2'
  2. 2+2
  3. 实际上,发生了两种非常不同的操作:

    1. String#+ - 将参数连接到源字符串。参数必须是一个字符串。
    2. Fixnum#+ - 这会将参数添加到源编号中。参数必须是数字。
    3. 因此,如果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

来自documentation

  

print(obj, ...)nil

     

依次将每个对象打印到$stdout。 [...]不是字符串的对象将通过调用to_s方法进行转换。

另一种方法是字符串插值,它也会自动调用to_s

print "2+2 is equal to #{2+2}"