[前][次][番号順一覧][スレッド一覧]

ruby-reference-manual:2845

From: 5 5 <redmine@r...>
Date: Mon, 3 Oct 2011 09:34:15 +0900
Subject: [ruby-reference-manual:2845] [るりまプロジェクト - Bug #5383] Enumerable#first のサンプルコード実行結果がおかしい


Issue #5383 has been updated by 5 5.


まず,h.first ですが,Ruby 1.8 系ではハッシュの要素を順に取り出すときに,どんな順で出てくるかが不定なので,るりまの記述は間違いとは言えません。

Ruby 1.9 では,順序が一定しており,いまの場合,必ず [:a, 1] が返るので,るりまが間違っています。

一方,p {}.first についてはテストの仕方が間違っています。これだと,{}.first の値を p に渡しているのではなく,p に空のブロックを渡して実行し,その結果(nil)に対して first しようとしています。
p({}.first) であれば,意図通りのテストになります。いずれにしてもるりまの実行例の書き方は間違っています。

さて,Ruby 1.8 系で Enumerable#first の実行例にハッシュを使うのは妥当でしょうか? 順序が一定しないものの first にほとんど意味はないので,他のオブジェクトがよさそうですが,何がよいのか単純な例が思いつきません。

なお,[].first はまた話が違ってきます。配列に first したときは,Enumerable#first は呼ばれず,Array クラスに実装された first が呼ばれるんだと思いますが,どうですか? >専門家の方

----------------------------------------
Bug #5383: Enumerable#first のサンプルコード実行結果がおかしい
http://redmine.ruby-lang.org/issues/5383

Author: 4ge0 rb
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
reporter: 
ruby_version: 


写経して実行すると

  p h.first     #=> [:a, 1]
  p h.first(2)  #=> [[:a, 1], [:b, 2]]
  p {}.first    #=> NoMethodError: undefined method `first' for nil:NilClass
  p {}.first(2) #=> NoMethodError: undefined method `first' for nil:NilClass
になりました。
環境は、WindowsXP SP3、Ruby1.9.2 p290 (One-Click Ruby Installer for Windows)

1.9.2 p290のenum.cを流し読みしましたが、ドキュメントの誤字と思いこちらに報告しました。
  p [].first    #=> nil
  p [].first(2) #=> []
となるので {} と [] の間違いでしょうか?

http://doc.okkez.net/を見て、1.9.1と1.8.7のドキュメントも同じだなと確認し、それ以前の

ドキュメントは確認していません。

環境を変えて試してみた結果は下記の通りです。
Ubuntu環境は使い慣れていない中で行ったので意味の無い情報かもしれません。

1.
  プログラムの追加と削除から前述の1.9.2を削除して、ActiveScriptRubyのRuby1.9.2-p290をインストール

 #=> 結果同じ

2.
  1.の状態から1.9.2を削除後に、One-Click Ruby Installer for Windows の 1.8.7 p352をインストール

 #=> 結果同じ

3.
  VMwarePlayer3.1.4上に入れていたUbuntu 11.04のUbuntuソフトウェアセンターから
 Interpreter of object-oriented scripting language Ruby 1.9.2をインストール。
 irbで試す。
 #=> 結果同じ

4.
  3.の状態からUbuntuソフトウェアセンターでRuby1.9.2削除。
 端末からsudo apt-get install rubyで1.8.7をインストールして、irbで試す。
 #=>  h = {:a => 1, :b => 2, :c => 3} を実行すると {:b => 2, :c => 3, :a =>1} と出力される。
       p {}.first は NoMethodError のまま。


-- 
http://redmine.ruby-lang.org

--
ML: ruby-reference-manual@m...
Info: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]