Ruby 请教一个 Ruby 语法问题

Gao-Jun · 2023年10月11日 · 最后由 Rei 回复于 2023年10月12日 · 511 次阅读

这几天看书的时候看到如下代码:

5.times do |n|
  if (n==2)..(n==3)
    puts n
  end
end

输出为

2
3

其中 if 的判断条件 (n==2)..(n==3) 单独放到 irb 里解析,会得到 bad value for range

那这个 if 判断中的条件应当如何理解呢?

其实测试一下

5.times do |n|
  puts n
end

就会发现,结果为 0,1,2,3,4,这样的话,就很好理解了,5.times do |n| 这种写法,默认 n 为 0,1,2,3,4。 当去掉这个 5.times do |n| ,单独测试 (n==2)..(n==3) 时,n 没有赋值,自然就会得到 bad value for range 的结果

y9info 回复

对于

(n==2)..(n==3)

n 如果未定义,报错信息为 undefined local variable or method `n' for main:Object (NameError)

n 先初始化一下,例如 n=2,报错信息变为 bad value for range (ArgumentError)

piecehealth 回复

原来如此,明白了。谢谢。

这个用法是不是参考的 Perl

echo $'ruby\npython\njava\nrust\nkotlin' | perl -ne 'print if /python/../rust/'
输出:
python
java
rust
echo $'ruby\npython\njava\nrust\nkotlin' | ruby -ne 'print if /python/../rust/'
输出:
python
java
rust

the Ruby team decided that flip-flop usage would (temporarily) raise a warning in Ruby v2.6 (shown below) and perhaps even be deprecated eventually. 弃用了,不要学

FrankFang 回复

紧接着的下一句话是:

However, it had to come back in version 2.7 onwards upon popular demand. Therefore, to run flip-flop code and follow along with our examples, you will need a Ruby installation with version > v2.7 (or < v2.6).

讨论 https://bugs.ruby-lang.org/issues/5400 的结果也是继续保留。从讨论过程看,的确在一些场景下,这个语法很方便。

简单,你别理这个好了,不是每个语法都要学会的,实际也用不到,别在这里费神,又不是搞语法研究。

第一次见这样写的,如果让我 code review 会驳回,写得简单点。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号