这几天看书的时候看到如下代码:
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 的结果
对于
(n==2)..(n==3)
n
如果未定义,报错信息为 undefined local variable or method `n' for main:Object (NameError)
将 n
先初始化一下,例如 n=2
,报错信息变为 bad value for range (ArgumentError)
这个用法是不是参考的 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. 弃用了,不要学
紧接着的下一句话是:
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 的结果也是继续保留。从讨论过程看,的确在一些场景下,这个语法很方便。