OP đã viết
Có vẻ như là lạ đối với tôi rằng cấu trúc trên không tạo ra kết quả như mong đợi. Lý do cho điều đó là gì? Những tình huống nào khi hành vi này là hợp lý?
không phải là 'Nó có thể được thực hiện?' nhưng để trả lời câu hỏi chưa được hỏi trước khi chuyển sang câu hỏi thực sự đã được hỏi:
$ 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
Vì reverse_each được cho là xây dựng toàn bộ một mảng, nên rõ ràng downto sẽ hiệu quả hơn. Thực tế là một nhà thiết kế ngôn ngữ thậm chí có thể xem xét việc triển khai những thứ như vậy tương tự như câu trả lời cho câu hỏi thực tế như được hỏi.
Để trả lời câu hỏi như thực sự đã hỏi ...
Lý do là vì Ruby là một ngôn ngữ vô cùng ngạc nhiên. Một số ngạc nhiên là thú vị, nhưng có rất nhiều hành vi bị phá vỡ hoàn toàn. Ngay cả khi một số ví dụ sau đây được sửa chữa bởi các bản phát hành mới hơn, thì vẫn có rất nhiều ví dụ khác và chúng vẫn như những cáo buộc về tư duy của thiết kế ban đầu:
nil.to_s
.to_s
.inspect
kết quả là "" nhưng
nil.to_s
# .to_s # Don't want this one for now
.inspect
kết quả trong
syntax error, unexpected '.', expecting end-of-input
.inspect
^
Bạn có thể mong đợi << và push giống nhau để thêm vào các mảng, nhưng
a = []
a << *[:A, :B] # is illegal but
a.push *[:A, :B] # isn't.
Bạn có thể mong đợi 'grep' hoạt động giống như dòng lệnh Unix tương đương của nó, nhưng nó === không khớp với = ~, mặc dù tên của nó.
$ echo foo | grep .
foo
$ ruby -le 'p ["foo"].grep(".")'
[]
Các phương pháp khác nhau là bí danh của nhau một cách bất ngờ, vì vậy bạn phải học nhiều tên cho cùng một thứ - ví dụ find
và detect
- ngay cả khi bạn giống như hầu hết các nhà phát triển và chỉ sử dụng cái này hay cái kia. Nhiều cùng đi cho size
, count
và length
, ngoại trừ cho các lớp học mà xác định mỗi khác nhau, hoặc không xác định một hoặc hai ở tất cả.
Trừ khi ai đó đã triển khai một cái gì đó khác - như phương pháp cốt lõi tap
đã được xác định lại trong các thư viện tự động hóa khác nhau để nhấn một cái gì đó trên màn hình. Chúc may mắn khi tìm ra điều gì đang xảy ra, đặc biệt nếu một số mô-đun được yêu cầu bởi một số mô-đun khác đã đóng một mô-đun khác để làm điều gì đó không có tài liệu.
Đối tượng biến môi trường, ENV không hỗ trợ 'hợp nhất', vì vậy bạn phải viết
ENV.to_h.merge('a': '1')
Như một phần thưởng, bạn thậm chí có thể xác định lại các hằng số của mình hoặc của người khác nếu bạn thay đổi ý định về những gì chúng nên là.