OP写道
我对上面的构造没有产生预期的结果感到奇怪。是什么原因呢?这种行为是合理的情况是什么?
不是“能做到吗?” 但要先回答未提出的问题,然后再提出实际提出的问题:
$ irb
2.1.5 :001 > (0..4)
=> 0..4
2.1.5 :002 > (0..4).each { |i| puts i }
0
1
2
3
4
=> 0..4
2.1.5 :003 > (4..0).each { |i| puts i }
=> 4..0
2.1.5 :007 > (0..4).reverse_each { |i| puts i }
4
3
2
1
0
=> 0..4
2.1.5 :009 > 4.downto(0).each { |i| puts i }
4
3
2
1
0
=> 4
由于声称reverse_each可以构建整个数组,因此downto显然会更有效率。语言设计师甚至可以考虑实施类似的事情,这与所提出的实际问题的答案息息相关。
要回答实际提出的问题...
原因是因为Ruby是一种永无止境的语言。有些惊喜是令人愉快的,但是有很多行为是彻底破坏的。即使以下某些示例已通过较新的版本进行了纠正,但仍有许多其他示例,它们仍然作为对原始设计思想的指示:
nil.to_s
.to_s
.inspect
结果为“”,但
nil.to_s
# .to_s # Don't want this one for now
.inspect
结果是
syntax error, unexpected '.', expecting end-of-input
.inspect
^
您可能希望<<和push对于追加到数组是相同的,但是
a = []
a << *[:A, :B] # is illegal but
a.push *[:A, :B] # isn't.
您可能希望'grep'的行为类似于其Unix命令行等效项,但是尽管名称相同,但它===匹配不等于=〜。
$ echo foo | grep .
foo
$ ruby -le 'p ["foo"].grep(".")'
[]
各种方法都是彼此的意外别名,因此find
,detect
即使您确实喜欢大多数开发人员并且只使用一个或另一个,您也必须为同一事物学习多个名称。大部分也是如此size
,count
和length
,除了其定义的每个不同的,或者没有定义在所有一两节课。
除非有人实现了其他功能-就像核心方法tap
已在各种自动化库中重新定义,以在屏幕上按下某些内容。祝你好运,找出正在发生的事情,特别是如果某个其他模块所需的某个模块已经使另一个模块完成了未记录的操作,则特别有用。
环境变量对象ENV不支持“合并”,因此您必须编写
ENV.to_h.merge('a': '1')
作为奖励,如果您改变主意,应该重新定义您或他人的常量。