在Ruby中,括号内的空白有多重要?

时间:2019-06-03 18:38:52

标签: ruby syntax

我刚刚发现,paren中的空格可能在Ruby中以意想不到的方式起作用: 以下是在语义上与我相同的3个函数:

results = []
n = len(Course_Specific_Vocabulary_Dict['Binary Vector'])
for a in Employee_Specific_Vocabulary_Dict['Binary Vector']:
    # Get same size array w.r.t Course_Specific_Vocabulary_Dict["Binary Vector]
    repeated_a = np.repeat([a], n, axis=0)
    results.append(np.bitwise_xor(repeated_a, Course_Specific_Vocabulary_Dict['Binary Vector']))

但是,def foo(x) return { :a => (x - 100), } end def bar(x) return { :a => (x - 100), } end def zot(x) return { :a => (x - 100), } end foo(10)返回zot(10)(正如我预期的那样),而{:a=>-90}返回bar(10)(令我沮丧和失望)。

我在这里想念什么?

2 个答案:

答案 0 :(得分:8)

这是一个不寻常的情况,但是我相信您看到的是Ruby将其解释为几个连续语句,而不是单个语句。如图所示:

x    # Statement 1
-100 # Statement 2

该代码块的结果为-100

对于zot,您已经表示了要通过悬挂-二进制运算符来继续下一行:

x - # Statement 1
100 # Statement 1 (cont)

值得注意的是,在进行方法调用时您不能这样做:

zot(x
 -100  # Syntax error
)

在那种情况下,参数语法规则要严格得多。在自由格式的(...)结构中,您具有更大的自由度。

答案 1 :(得分:5)

在Ruby中,有两种可能的表达式分隔符:分号;和换行符。

所以

a
b

相同
a; b

这意味着

a
- b

相同
a; - b

相同
a; b.-@()

当然,您希望它等同于

a - b

相同
a.-(b)

要点是:这两种解释中的每一种都是同等有效的。语言设计者必须选择这两种解释中的一种,在这种情况下,他们选择第一种。两者都不是“正确”或“正确”的。

如果他们选择了第二种解释,那么您就不会问这个问题,但是会有其他人问相反的问题。