«前の日記(2006-12-19) 最新 次の日記(2006-12-21)» 編集

Matzにっき


2006-12-20 [長年日記]

_ [Ruby] tech addict - ruby gotchas and caveats

Rubyの落とし穴。

  1. strings aren't auto converted into numbers or strings
  2. false and nil are the only valid false values, anything else is true
  3. && and || are the high priority AND/OR constructs, and and or are low priority versions
  4. Exceptions and raise vs catch
  5. no class/module unloading
  6. no native unicode (ruby < 2.0)
  7. private never truely private
  8. 1/2 != 0.5 unless require 'mathn' (this is the default in many languages anyway, sometimes integer math is your friend). With mathn 1/2 becomes a different type (Rational) than 0.5 (Float)
  9. class variables and their inheritance semantics
  10. singleton class modification for the class objects isn't good or really allowed
  11. assignment methods always return the assigned value, not the return value of the assignment function
  12. local variable scoping is tricky and can hide other variables and methods (this is slated for a change in ruby 2.0)
  13. You might think that class_eval would provide access to the class's context and variables, apparently not so much.

実例を見ないとわからないものもあるが、まあ、おおむね妥当であろう(ただし、6は誤解。1,2,3,4,7,8,11,12は慣れの問題。9,10,13はもうちょっと考えてみよう)。

追記

コメントにもあるように5も誤解。クラス名である定数が削除され、 サブクラスが存在せず、インスタンスがすべて回収されれば、 クラスやモジュールもGCの対象になる。 ライブラリ全体をunloadする機能はないが、ある言語の方が珍しいと思う。

9は1.9では解決されている(クラス変数は継承しない)。

10はsingleton methodはクラス変数の場所を変更しない(囲んでいるclass文だけで決まる) ことを理解すれば問題なし。慣れの問題。

13はあまり使いやすくない仕様なので、将来の1.9では変更しよう。 手元ではもう直した。

どう変更したかと言うと、以下の通り

  • クラス変数の格納場所はもっとも内側のclass文またはmodule文が定義しているクラス(またはモジュール) [これは以前から]
  • 特異メソッド定義は「格納場所」を変えない [以前から]
  • 特異クラスも「格納場所」の対象になる [新規]
  • よって特異クラス定義は「格納場所」を変更する [新規]
  • トップレベルにはそれを囲むclass文もmodule文もないから、警告が出る [以前から]
  • トップレベルでのクラス変数の「格納場所」はObject [以前から]

これもeigenclass化への一歩かもしれない。

_ [言語] Guido van Rossum on the Python 3000 process

Python 3000について、抽象的な話が多くて、 具体的な実装などについて語る人はあんまりいないという話。

Pythonくらい大所帯だといろいろ大変なんだろうなあ。 Rubyでは抽象的な話をしたがる人もあまりいないから。 まあ、それは私がすき勝手できるということでもあるのだけれど。

  • Python 3000は2007年前半リリース希望
  • UnicodeとStringの統一(Bytesの新設)
  • IOの再実装
  • keys, items, values()のイテレータ化戻り値の変更

また、Python 3000の先、Python 4000の話を始めてくれて結構、とのこと。 Python 3000が具体的になりそうになって、新たな「遠くの目標(aka 燃料)」が必要になった とも言えるかもしれない。

本日のツッコミ(全7件) [ツッコミを入れる]
_ okuji (2006-12-28 17:11)

keys等はPython 3000ではイテレータ化されません。代わりにsetっぽいインターフェースのオブジェクトを返すことになってます(listを返すよりは効率が良い)。影響が大き過ぎるからという理由になってますが、では他の変更は影響が大きくないかのとツッコミたくなりますが。多分lenとかやると、イテレータの中身が食われてしまうのが嫌だったんではないですか。

_ まつもと (2006-12-28 17:51)

おお、読み落としてました。どうもです。<br>Rubyでもmapとかの戻り値を配列モドキにしようかなあ。

_ なひ (2006-12-28 18:08)

5はどうでしょう。

_ まつもと (2006-12-28 18:16)

unloadingですか。<br><br>Javaでもunloadingできるのはかなり限定的な状況だけですし、逆にRubyでも定数を削除した上で、参照しているオブジェクトが全てなくなればクラスやモジュールもGCの対象になるわけですし。落とし穴というほどのことはないような。

_ かるた (2006-12-29 23:40)

慣れの問題って言われると,なんか全て解決できそう・・・

_ まつもと (2006-12-30 00:01)

言い方が悪かったですかね > 慣れの問題<br><br>要するに「その人のバックグラウンドによっては違和感を感じることもあるだろうが、決して『おかしい』というわけではなくそれがRuby流であるとして慣れていただいた方が、Rubyを使ううえでは幸せだろう」という意味なんですが。

_ oo (2006-12-31 20:35)

>慣れの問題<br>そもそもこういう「落とし穴」って、「〇〇言語プログラマにとって〜」と前置きしないと意味無いですよね。<br><br>(Perl,PHP)で "0" が偽なのは他のほとんどすべての言語プログラマにとって重大な落とし穴だと思います。

お名前:
E-mail:
コメント:
[]

«前の日記(2006-12-19) 最新 次の日記(2006-12-21)» 編集

track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.