红宝石中'do..end'和"{..}"块的不同行为

mma*_*mar 3 ruby

很抱歉,这个问题是重复的.但我无法找到使用上的差异.当我运行以下代码时,我得到了不同的答案.我从大多数教程中看到,使用"do ... end"与"{...}"块相同.

include Comparable

a = [1, 4, 2, 3, 5]

p a.sort do |x,y|
    y <=> x
end
Run Code Online (Sandbox Code Playgroud)

输出显示为= [1,2,3,4,5]

但是当我这样跑的时候......

include Comparable

a = [1, 4, 2, 3, 5]

p a.sort { |x,y|
    y <=> x
}
Run Code Online (Sandbox Code Playgroud)

输出显示为= [5,4,3,2,1]

这里有什么问题.是否存在两种语法有任何不同行为的情况?

saw*_*awa 5

优先权不同.第一个被解释为

p (a.sort) do
  ...
end
Run Code Online (Sandbox Code Playgroud)

由于未传递块sort,因此将按默认的升序排序.然后,块传递给p,不使用它.

  • 你可以使用其中之一.正如Óscar所写,惯例是在一行上使用`do ... end`表示多行和`{...}`.但是,如果使用`{...}`以及带参数的方法,则可能需要将参数括在括号中以使其清楚. (2认同)