OP menulis
Tampaknya aneh bagi saya bahwa konstruksi di atas tidak memberikan hasil yang diharapkan. Apa alasannya? Apa situasi ketika perilaku ini masuk akal?
bukan 'Bisakah itu dilakukan?' tetapi untuk menjawab pertanyaan yang tidak ditanyakan sebelum sampai pada pertanyaan yang sebenarnya ditanyakan:
$ 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
Karena reverse_each diklaim untuk membangun seluruh array, downto jelas akan lebih efisien. Fakta bahwa seorang perancang bahasa bahkan dapat mempertimbangkan untuk mengimplementasikan hal-hal seperti itu agak terkait dengan jawaban atas pertanyaan sebenarnya seperti yang ditanyakan.
Untuk menjawab pertanyaan seperti yang sebenarnya ditanyakan ...
Alasannya karena Ruby adalah bahasa yang selalu mengejutkan. Beberapa kejutan memang menyenangkan, tetapi ada banyak perilaku yang benar-benar rusak. Meskipun beberapa dari contoh berikut ini dikoreksi oleh rilis yang lebih baru, masih banyak lainnya, dan mereka tetap sebagai dakwaan pada pola pikir dari desain aslinya:
nil.to_s
.to_s
.inspect
menghasilkan "" tetapi
nil.to_s
# .to_s # Don't want this one for now
.inspect
menghasilkan
syntax error, unexpected '.', expecting end-of-input
.inspect
^
Anda mungkin mengharapkan << dan mendorong menjadi sama untuk menambahkan ke array, tapi
a = []
a << *[:A, :B] # is illegal but
a.push *[:A, :B] # isn't.
Anda mungkin berharap 'grep' berperilaku seperti baris perintah Unix yang setara, tetapi ia tidak === cocok dengan not = ~, terlepas dari namanya.
$ echo foo | grep .
foo
$ ruby -le 'p ["foo"].grep(".")'
[]
Berbagai metode secara tidak terduga merupakan alias untuk satu sama lain, jadi Anda harus mempelajari banyak nama untuk hal yang sama - misalnya find
dan detect
- bahkan jika Anda memang menyukai kebanyakan pengembang dan hanya menggunakan satu atau yang lain. Hal yang sama berlaku untuk size
,, count
dan length
, kecuali untuk kelas yang mendefinisikan masing-masing secara berbeda, atau tidak mendefinisikan satu atau dua sama sekali.
Kecuali seseorang telah menerapkan sesuatu yang lain - seperti metode inti tap
telah didefinisikan ulang di berbagai pustaka otomatisasi untuk menekan sesuatu di layar. Semoga berhasil mencari tahu apa yang terjadi, terutama jika beberapa modul yang dibutuhkan oleh modul lain telah menggunakan modul lain untuk melakukan sesuatu yang tidak terdokumentasi.
Objek variabel lingkungan, ENV tidak mendukung 'merge', jadi Anda harus menulis
ENV.to_h.merge('a': '1')
Sebagai bonus, Anda bahkan dapat mendefinisikan ulang konstanta Anda atau orang lain jika Anda berubah pikiran tentang apa yang seharusnya.