Ruby << 语法方法会引发错误,但 .push 方法在使用 yield 时不会。为什么?

Lor*_*ssi 2 ruby ruby-on-rails

我想弄清楚为什么案例 C 不起作用。正如您所看到的,当我使用 'yield' 和 '<<' 糖语法时,它会引发错误,但如果我使用该方法的名称 'acc.push',它会起作用。另一方面,如果我使用 'result' 变量来获取 yield 结果,然后使用 << 语法添加到 acc 数组,它就可以工作。我只是想了解为什么它在 C 的情况下不起作用。谢谢。

案例 A - 工作正常

def my_map(my_arr)
    c = 0 # the counter
    acc = [] # new array
    until c == my_arr.length
        acc.push(yield my_arr[c])
        c += 1
    end
    acc
end
p my_map( [1,2,3,4] ) { |each| each * 10 }
Run Code Online (Sandbox Code Playgroud)

案例 B - 工作正常

def my_map(my_arr)
    c = 0 # the counter
    acc = [] # new array
    until c == my_arr.length
        result = yield my_arr[c]
        acc << result
        c += 1
    end
    acc
end
p my_map( [1,2,3,4] ) { |each| each * 10 }
Run Code Online (Sandbox Code Playgroud)

案例 C - 错误:语法错误,意外的局部变量或方法,期望‘end’ acc << yield my_arr[c]

def my_map(my_arr)
    c = 0 # the counter
    acc = [] # new array
    until c == my_arr.length
        acc << yield my_arr[c]
        c += 1
    end
    acc
end
p my_map( [1,2,3,4] ) { |each| each * 10 }
Run Code Online (Sandbox Code Playgroud)

spi*_*ann 5

虽然您期望 Ruby 解释acc << yield my_arr[c]

acc.<<(yield(my_arr[c]))
Run Code Online (Sandbox Code Playgroud)

Ruby 实际上是这样理解的

acc.<<(yield)(my_arr[c])
Run Code Online (Sandbox Code Playgroud)

这没有多大意义。正如其他人已经提到的,它可以通过使用括号来修复:

acc << yield(my_arr[c])
Run Code Online (Sandbox Code Playgroud)