トップページ > プログラム > 2014年07月30日 > ucnjA6/+

書き込み順位&時間帯一覧

6 位/196 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000003025



使用した名前一覧書き込んだスレッド一覧
749
デフォルトの名無しさん
173
Rubyについて Part49
Ruby 初心者スレッド Part 55

書き込みレス一覧

Rubyについて Part49
761 :749[sage]:2014/07/30(水) 21:05:33.45 ID:ucnjA6/+
>>752
> その理解はちょっとよく分からない。

「一般には」という表現よりも「伝統的には」とか「古典的には」という
言葉のほうが、適切だったかもしれない

伝統的なメタプログラミングは、LISP/Smalltalk/Ruby といった
動的型付け言語における実行時の自己書き換え(コードの参照/追加/更新/削除)を指す
この伝統的なメタプログラミングは、リフレクション(refrection, 自己反映や自己適応)とも呼ばれる
それに対して、C++ の RTTI や Java のリフレクションは実行時における型情報の参照に
限定されているから、イントロスペクション(introspection, 自己参照)と呼ぶのが正しい
(ただし、Java のリフレクションは誤った命名だけど、今さらそれを改めるのは現実的ではない)

要するに、C++/Java等の静的型付け言語におけるメタプログラミング(=イントロスペクション)と
Ruby等の動的型付け言語におけるメタプログラミング(=リフレクション)は実現原理からして
全く異なるものだから、両者を単純に並べたり比べて論じようとする >>739 のような主張は
「分かってもいないのに分かったつもりでいるお馬鹿さん」ですよ、と言いたかった


>> それをRTI(Runtime Type Information,実行時型情報) の API を介して自由に参照できる
> へーそれは知らなかった。勉強になる

RTI 関しては、いくつか恥ずかしい間違いがあったので、訂正する
・まず RTI(Runtime Type Information) は誤りで、正しくは RTTI(RunTime Type Information)
・RTTI は(一般には)C++固有の用語だから、Javaのリフレクションに用いるのは適切ではない
・Java のシリアライゼーションは、リフレクションとは全く関係ない(>>749では大嘘を書いていた)

ただし、>>739 の「Javaのジェネリクスは、リフレクションとは組み合わせられない」という
主張が明らかな間違いである、という >>949 末尾の指摘は変わらない
Rubyについて Part49
762 :デフォルトの名無しさん[sage]:2014/07/30(水) 21:07:57.09 ID:ucnjA6/+
>>753
ポリモーフィズム(polymophizm, 多相または多態)は、メタプログラミングとは無関係だ
もう勘弁してくれ
Ruby 初心者スレッド Part 55
173 :デフォルトの名無しさん[sage]:2014/07/30(水) 21:35:33.47 ID:ucnjA6/+
・Pythonを書き始める前に見るべきTips - Qiita
  http://qiita.com/icoxfog417/items/e8f97a6acad07903b5b0
  Pythonは何かとトラップが多い言語で、
  引っかかるとなんてゴミ言語と感じてしまうことが少なからずある

要するに Python への批判記事である訳だけど、
この記事の視点を Ruby に当てはめてみよう

・ファイルのエンコードを宣言する必要がある
 Ruby => Ruby 1.9 でこのゴミ仕様が取り込まれて危うかったけど、
  Ruby 2.0 ではデフォが UTF-8(Unicode) になってゴミを排除できた

・文字列には通常の文字列とユニコード文字列がある
 Ruby => Ruby では最初から(少なくとも Ruby 1.4 の時代から)一般的な文字列は
  多言語化に対応した String クラス、ただ一つだけしか存在していません

・割り算の結果がfloat型にならない
 Ruby => 「強い型付け」による動的型付け言語である Ruby からすれば、
  この指摘そのものが規約違反であって、1 / 3 は 0 で 3 / 2 は 1 になるのが自然であり、
  もしfloat型が必要であれば、たとえば 1.to_f / 3 のように明示的に型変換すべきと考えます

  おそらく著者は「弱い型付け」による動的型付け言語である JavaScript の経験が
  長いのでこのような不満を感じたのでしょう、JavaScript は Python 3 と同じ結果になります
    js> 1/3
    0.3333333333333333
    js> 3/2
    1.5
  そして、Python 3 は「弱い型付け」に向かって変化したのですから、
  次の Python 4 では、おそらく以下のような実行結果へと仕様改訂されることでしょう(棒
    >>> "A"+1
    'A1'
(長いので、一旦ここで切る)
Ruby 初心者スレッド Part 55
178 :デフォルトの名無しさん[sage]:2014/07/30(水) 23:43:44.39 ID:ucnjA6/+
・新スタイルクラスと旧スタイルクラスがある
 Ruby => CLOS や Smalltalk と同様な動的型付け/動的メソッド束縛方式の
  オブジェクト指向言語として設計されたRubyのクラス定義スタイルは、
  最初から(少なくとも Ruby 1.4 の時代から)変更がありません

  Python に関しては、もともと手続き型言語として設計されたものに後から
  オブジェクト指向を付け足す際、開発チームの「オブジェクト指向への理解不足」によって
  静的型付け/静的メソッド束縛言語のオブジェクト指向を導入したという「過ち」がありました
  結果として、リフレクションを多用する最近のメタプログラミング・スタイルに追従できず、
  旧スタイルを排除して新スタイルに「改めざるをえなかった」のだと思われます

・コンストラクタ(と思われるもの)が2つある
 Ruby => 最初からオブジェクト指向言語として設計された Ruby では、
  コンストラクタは Class.new、イニシャライザは Object#initialize と
  明確に区別されていますから、「可読性に劣る Python 」のような混乱はありません

・PrivateやProtectedがない
 Ruby => Ruby にはメソッドの可視性を指定する private や protected があります
  (ただし、個人的にはこれら可視性を宣言するよりも、public メソッドの名前の
   前(または前後に) '_' あるいは '__' を付けるスタイルを好みます )
  また Ruby には名前の先頭に付ける '_' や '__' について、言語としての「強制」は無く、
  命名スタイルはプログラマの判断に委ねられています

・メソッドの第一引数が予約されている
 Ruby ==> 最初からオブジェクト指向言語としている Ruby では、(コードが self だらけに
  なってしまう)「Python のような冗長で可読性に劣る規約の強制」はありません
  Smalltalk と同様に、メソッド呼び出し先として自身を「明示したい時にだけ」
  疑似変数 self を、親クラスを「明示したい時にだけ」疑似変数 super を書くだけです

(まだ続くが、次で終わる予定)
Ruby 初心者スレッド Part 55
179 :173[sage]:2014/07/30(水) 23:55:37.21 ID:ucnjA6/+
書き忘れたけど、>>178 は >>173 の続きです


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。