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
^
<<를 예상하고 배열에 추가 할 때 푸시가 동일 할 것으로 예상 할 수 있지만
a = []
a << *[:A, :B] # is illegal but
a.push *[:A, :B] # isn't.
아마도 'grep'이 Unix 명령 줄과 동일하게 작동 할 것으로 예상 할 수 있지만 이름에도 불구하고 ===가 아닌 === 일치합니다.
$ echo foo | grep .
foo
$ ruby -le 'p ["foo"].grep(".")'
[]
예 - 여러 같은 일의 이름 배워야 할 수 있도록 다양한 방법, 예기치 않게 서로 앨리어스 (alias) find
과 detect
- 당신은 대부분의 개발자처럼 할 만 어느 하나 또는 다른를 사용하는 경우에도. 거의 같은 간다에 대한 size
, count
그리고length
다른 각을 정의, 또는 모두에서 하나 또는 두 개의 정의하지 않는 클래스를 제외하고.
누군가가 다른 것을 구현하지 않는 한-핵심 방법 tap
이 다양한 자동화 라이브러리에서 재정의되어 화면에서 무언가를 누르는 것과 같습니다. 특히 다른 모듈에 필요한 일부 모듈이 문서화되지 않은 작업을 수행하기 위해 또 다른 모듈을 사용하는 경우에 무슨 일이 일어나고 있는지 알아내는 행운을 빕니다.
환경 변수 개체 인 ENV는 '병합'을 지원하지 않으므로 작성해야합니다.
ENV.to_h.merge('a': '1')
보너스로, 자신이나 다른 사람의 상수가 무엇이어야하는지에 대한 마음이 바뀌면 다시 정의 할 수도 있습니다.