在Ruby中,{}和之间有什么区别[]?
{} 似乎用于代码块和哈希.
是[]只为数组?
文件不是很清楚.
Ruby:
true == true == true
Run Code Online (Sandbox Code Playgroud)
语法错误,意外的tEQ
与JavaScript:
true == true == true
// => true
Run Code Online (Sandbox Code Playgroud)
与C:
1 == 1 == 1
// => 1
Run Code Online (Sandbox Code Playgroud) ruby operators syntax-error operator-precedence associativity
我遇到了这种引起错误或混乱的奇怪副作用.所以,想象一下,这不是一个简单的例子,但的一个例子疑难杂症可能.
name = "Zorg"
def say_hello(name)
greeting = "Hi there, " << name << "?"
puts greeting
end
say_hello(name)
puts name
# Hi there, Zorg?
# Zorg
Run Code Online (Sandbox Code Playgroud)
这不会改变名称.名字还在Zorg.
但现在看一个非常微妙的区别.在下一个例子中:
name = "Zorg"
def say_hello(name)
greeting = name << "?"
puts "Hi there, #{greeting}"
end
say_hello(name)
puts name
# Hi there, Zorg?
# Zorg? <-- name has mutated
Run Code Online (Sandbox Code Playgroud)
现在名字是Zorg?.疯.greeting =任务中的细微差别.Ruby在内部使用解析(?)或消息传递链接?我以为这只会像铲子一样链起来name.<<("?"),但我想这不会发生.
这就是为什么我在尝试连接时避免使用铲子操作符的原因.我一般尽量避免变异状态,但Ruby(目前)尚未针对此进行优化(尚未).也许Ruby 3会改变一切.很抱歉有关Ruby未来的范围 - 蠕变/侧面讨论.
我认为这特别奇怪,因为具有较少副作用的示例(第一个)具有两个铲操作符,其中具有更多副作用的示例具有更少的铲操作符.
更新 你是正确的DigitalRoss,我让它太复杂了.减少的例子:
one = "1"
two …Run Code Online (Sandbox Code Playgroud) oror 似乎优先级低于没有括号的方法调用:
puts false or true
Run Code Online (Sandbox Code Playgroud)
相当于
( puts false ) or true
Run Code Online (Sandbox Code Playgroud)
和显示false.
注意:我知道or不应该使用.不过,这是一个很好的例子,表明某些运算符的优先级低于方法调用.
||puts false || true
Run Code Online (Sandbox Code Playgroud)
相当于
puts (false || true)
Run Code Online (Sandbox Code Playgroud)
和显示true.
用于方法调用的括号似乎不是分组:
puts(false or true)
# SyntaxError: unexpected keyword_or
puts((false or true))
#=> true
Run Code Online (Sandbox Code Playgroud)
带括号和不带括号的方法调用应该在这个优先级表中的哪个位置?
我正在寻找表中方法调用的确切位置.优选地,通过示例证明它低于前一个并且高于下一个.
目前的答案似乎也没有提到带括号的方法调用.
提前致谢!
在以下示例中,我无法理解Ruby运算符的优先级:
x = 1 && y = 2
Run Code Online (Sandbox Code Playgroud)
由于&&优先级高于=,我的理解是+与*运营商类似:
1 + 2 * 3 + 4
Run Code Online (Sandbox Code Playgroud)
这被解决为
1 + (2 * 3) + 4
Run Code Online (Sandbox Code Playgroud)
它应该等于:
x = (1 && y) = 2
Run Code Online (Sandbox Code Playgroud)
但是,所有Ruby源代码(包括内部语法分析器Ripper)都将其解析为
x = (1 && (y = 2))
Run Code Online (Sandbox Code Playgroud)
为什么?
编辑[08.01.2016]
让我们关注一个子表达式: 1 && y = 2
根据优先规则,我们应该尝试将其解析为:
(1 && y) = 2
Run Code Online (Sandbox Code Playgroud)
这没有意义,因为=需要特定的LHS(变量,常量,[]数组项等).但由于它(1 && y)是一个正确的表达式,解析器应如何处理它?
我已经尝试过咨询Ruby了parse.y,但它是如此意大利面,我无法理解具体的作业规则.
当涉及数字文字时,一元减号似乎具有特殊的优先级。这是有记录的行为吗?
我见过的优先级表(例如here)甚至没有提到点(方法调用)运算符。
在 ruby 2.3.6 上测试:
puts "=== literal integer ==="
# `-` has higher precedence than `.`
p( -1.abs ) # => 1
p( -(1.abs) ) # => -1 (previous line should match this if `.` had higher precedence)
puts "=== literal float ==="
# again `-` has higher precedence than `.`
p( -1.2.abs ) # => 1.2
p( -(1.2.abs) ) # => -1.2 (previous line should match this if `.` had higher precedence)
puts "=== integer …Run Code Online (Sandbox Code Playgroud) 如果给出以下内容
a = [1,2,3]
b = [3,4,5]
a&b #=> [3]
b - a&b #=> [4,5]
b - a #=> [4,5]
Run Code Online (Sandbox Code Playgroud)
为什么这样做
[1,2,3] - [3] #=> [1,2]
Run Code Online (Sandbox Code Playgroud)
但不是这个
a - a&b #=> [] ??
Run Code Online (Sandbox Code Playgroud)