Ruby数量相等?

jac*_*ang 4 ruby

两个数字比较,如下所示:

#!/usr/bin/ruby

a=1000, b=1000, c=1000, d=1000
puts a==b, c==d
Run Code Online (Sandbox Code Playgroud)

但打印:

false
true
Run Code Online (Sandbox Code Playgroud)

为什么Ruby比较这样的结果?

For*_*er0 8

Ruby在一行上设置多个变量的快捷方式与C-esque语言略有不同.

正如SimpleLime的答案中所指出,您使用的语法实际上会创建a变量的数组.

正如另一个在评论中指出的那样,编写示例的方式将评估如下:

a = [1000, (b = 1000), (c = 1000), (d = 1000)]
Run Code Online (Sandbox Code Playgroud)

虽然b,cd设定为预期的,a其实不然.a设置为数组,而b,, cd设置为1000,因为variable = value实际上是一个返回给定值的方法调用.

您真正想要的Ruby语法如下所示:

a, b, c, d = 1000, 1000, 1000, 1000
Run Code Online (Sandbox Code Playgroud)

或它实际评估的内容:

a, b, c, d = [1000, 1000, 1000, 1000]
Run Code Online (Sandbox Code Playgroud)

如果所有值都相同,您还可以使用非常常见的其他快捷语法.

a = b = c = d = 1000
Run Code Online (Sandbox Code Playgroud)

但是如果不使用"值"类型(例如数值或布尔值),请注意此语法,因为所有对象将共享相同的引用.


Sim*_*ime 6

在ruby中,您不需要使用方括号[]来创建数组.所以你的变量创建线没有按照你的想法行事:

a=1000, b=1000, c=1000, d=1000
p a # [1000, 1000, 1000, 1000]
p b # 1000
p c # 1000
p d # 1000
Run Code Online (Sandbox Code Playgroud)

那么,a == b比较数组[1000, 1000, 1000, 1000] == 1000,这显然是错误的

  • 这被解析为`a = [1000,(b = 1000),(c = 1000),(d = 1000)]`.赋值是Ruby中的一个表达式,因此得到与`a = [1000,1000,1000,1000]`相同的结果,但具有分配其他变量的副作用 (3认同)