相关疑难解决方法(0)

红宝石中"不"和"!"之间的区别

我记得在那里阅读not!进行了不同的评估,我在文档中找不到它.他们是同义词吗?

ruby boolean-logic

87
推荐指数
2
解决办法
5万
查看次数

Ruby中不同的括号是什么意思?

在Ruby中,{}和之间有什么区别[]

{} 似乎用于代码块和哈希.

[]只为数组?

文件不是很清楚.

ruby syntax

83
推荐指数
3
解决办法
4万
查看次数

65
推荐指数
2
解决办法
3391
查看次数

为什么Ruby中的双铲不会改变状态?

我遇到了这种引起错误或混乱的奇怪副作用.所以,想象一下,这不是一个简单的例子,但的一个例子疑难杂症可能.

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)

ruby string

12
推荐指数
1
解决办法
323
查看次数

使用括号和不使用括号的方法调用的优先级是什么?

以前的答案

回答一个类似的问题是错误的.

在Ruby 文档社区维基中都没有提到方法调用.

没有括号的方法调用

比......高 or

or 似乎优先级低于没有括号的方法调用:

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 methods operator-precedence

9
推荐指数
1
解决办法
581
查看次数

理解Ruby中赋值和逻辑运算符的优先级

在以下示例中,我无法理解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,但它是如此意大利面,我无法理解具体的作业规则.

ruby grammar abstract-syntax-tree

7
推荐指数
1
解决办法
159
查看次数

一元减号对于数字文字是否应该具有更高的优先级?

当涉及数字文字时,一元减号似乎具有特殊的优先级。这是有记录的行为吗?

我见过的优先级表(例如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)

ruby

4
推荐指数
1
解决办法
194
查看次数

数组差异在不在变量中时起作用

如果给出以下内容

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)

ruby arrays

2
推荐指数
1
解决办法
44
查看次数