- 1 名前:uy [2012/08/11(土) 12:21:25.19 ]
- 面白かったのでコピペ
979 名前:uy[sage] 投稿日:2012/08/11(土) 11:53:55.80 面接官「特技はRubyとありますが?」 学生 「はい。Rubyでならなんでもかけます。」 面接官「ではシングルトンパターンを書いてください。」 学生 「存在しません?」 面接官「え、存在しない?」 学生 「はい。存在しません。Rubyはシングルトンパターンを言語でサポートしています。」 面接官「・・・で、その言語でサポートされた機能を使うとシングルトンパターンになるんですよね?」 学生 「はい。シングルトンパターンです。」 面接官「いや、あなたRubyでシングルトンパターンは存在しないといいましたよね。なぜシングルトンパターンになるんですか?」 学生 「でも、シングルトンパターンは存在しないんですよ。」 面接官「いや、存在しないとか問題じゃなくてですね・・・」 学生 「Rubyなら簡単にシングルトンパターン書けますよ。」 面接官「ふざけないでください。それに機能が用意されてるってことは存在するでしょ。だいたい・・・」 学生 「機能は用意されていますが言語でサポートしているんです。だから存在しません。」 面接官「聞いてません。帰って下さい。」 学生 「あれあれ?怒らせていいんですか?シングルトンパターン書きますよ。」 面接官「いいですよ。書いてください。Rubyでシングルトンパターンを。それで満足したら帰って下さい。」 学生 「運がよかったな。Rubyにシングルトンパターンは存在しないようだ。」 面接官「帰れよ。」
- 73 名前:デフォルトの名無しさん mailto:sage [2012/08/12(日) 23:21:20.74 ]
- >>69
キチガイをヲチしてニヤニヤするスレです ほーらruby厨がすぐ近くに!
- 74 名前:デフォルトの名無しさん mailto:sage [2012/08/12(日) 23:26:12.33 ]
- >>68
自分は>>54だけど>>66とは別人(どうでもいいけど) 探してみたらJavaScriptにも雑用向けのライブラリ入りの処理系がちょいちょいあるようだ https://developer.mozilla.org/en-US/docs/JavaScript/Shells そのうちJSDBって処理系だとこう書けるらしい。普通に使えそう www.jsdb.org/cookbook.html
- 75 名前:デフォルトの名無しさん mailto:sage [2012/08/12(日) 23:35:50.63 ]
- varってどうにかならんの
- 76 名前:デフォルトの名無しさん mailto:sage [2012/08/12(日) 23:37:57.29 ]
- つ coffeescript
- 77 名前:デフォルトの名無しさん mailto:sage [2012/08/12(日) 23:39:19.32 ]
- JavaScriptのvarは省略できるけどグローバル変数になるんだったか
- 78 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 10:33:57.60 ]
- JSはvarがあるから良いんだよ。
動的型言語だから、型を指定する必要は無いけど、 それでも変数のスコープを指定する必要はあるので、 結局変数宣言は省けない。 無理に省くとPythonやRubyみたいに奇妙なことになる。
- 79 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 10:36:32.02 ]
- JS益々低迷。
www.tiobe.com/index.php/paperinfo/tpci/JavaScript.html
- 80 名前:デフォルトの名無しさん [2012/08/13(月) 11:11:23.23 ]
- てかそれだとjsってイテレータ用の変数にまでvarつけなきゃじゃねーの
使われない理由のひとつがまずそこら辺だろう
- 81 名前:デフォルトの名無しさん [2012/08/13(月) 11:13:52.71 ]
- グローバル変数のほうが使う機会って少ないんだから
何かオプションつけて宣言するならグローバル変数のほうだよ jsは逆に設計しちゃったのか? ローカル変数は簡単な記述でいいのに
- 82 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 11:56:10.67 ]
- >>81
一理あるが、それがその場しのぎの屁理屈ではないということを示すためには 「引数も多いから引数も宣言するべきではない」と言い切る覚悟が必要
- 83 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 11:57:16.00 ]
- ML系の言語、たとえばSML(Standard ML)だと、
代入(名前への値の束縛)にはJSと同様、文の頭に val が付く。 ただし、SMLの場合はあらゆる構文で文が予約語から始まることで 言語全体の構文が簡潔で明解になっている。 また階層的で明確な名前空間があるから、変数にグローバルや ローカルといった区別は不要。トップレベルで代入された変数が、 いわるゆグローバル変数と同等な扱いになる。さらには大規模開発向けに モジュールによって名前空間を明示的に分離できる。 考えるに、元々JSはWebブラウザ上の素朴な簡易スクリプト言語として 設計されたけど、近年では重要度が増して開発規模が増大してきた。 言語設計の想定外の用途に利用が広がったことの弊害ではないかと思う。 結論から言うと、言語設計時に大規模開発を想定していた PythonやRubyといった他のLLと比較して、JSは大規模開発に向いていない。
- 84 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:03:30.82 ]
- そもそもブロックスコープがないjsでローカル変数っていうのもな
Cみたいに関数冒頭で宣言する言語なんだろ結局 関数ネストがよく使われる言語だし jsで大規模やろうとするとオレオレのクラス実装や名前空間実装出てきちゃうのはあるな その為のcoffeescriptとかなんだろうけど
- 85 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:05:04.84 ]
- >>82
全然わからんので日本語で頼む
- 86 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:06:26.04 ]
- >>81
グローバルとローカル以外にも、その中間にあたる、ネストスコープとかあるから。 特に最近はクロージャやラムダを多用する方向だから、ネストスコープだらけになる。 もし変数宣言がなければ、の { i=0; { i=1; } } 内側のiと外側のiが同じものなのか違うものなのか区別を付けれない。 ちなみに、Rubyだと同じもの、Pythonだと違うもの、となる。 Ruby方式だと、意図せずに変数名が被ったときにバグるし、 Python方式だと、外のスコープの変数への代入が出来ない。 その点、JSだと、varが付いていれば新しい変数、なければ外のスコープの変数、 だから、使い分けが出来るし、かつ安全で、可読性も高い。
- 87 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:13:47.63 ]
- >>83
言ってることはわからなくも無いが、スコープについて言及しているのであれば、最後の一文、 >PythonやRubyといった他のLLと比較して、JSは大規模開発に向いていない。 これはおかしい。なぜならPythonやRubyのスコープは、JSよりもさらに劣っているから。 特にPythonはスコープ内での代入の有る無しでスコープが切り替わる。 この前代未聞なカス仕様を擁護できる奴は誰もいない。マジでひどい。 3.0でnonlocal追加したときに、このカス仕様も修正すればよかったのに。 nonlocalがあるなら、代入の有る無しでスコープが切り替わるカス仕様は要らないわな。
- 88 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:14:01.62 ]
- >>85
お前それサバンナでも同じこと言い切る覚悟あるの?
- 89 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:16:12.13 ]
- すでにJSはブラウザ上の実装が全世界で広がっているから、
Pyhtonのような思いきって後方互換性を切り捨てるというような 言語仕様の変更や拡張は無理だろうね。 言い換えると、今後とも言語仕様の発展性は見込めない。
- 90 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:17:06.52 ]
- >>86
けどそれだとちょっとした小さな使い捨てスクリプトを書く時に varをつけるかつけないか悩む事にならね? 使い捨てスクリプトとして書いても、後からコピペして別の場所で使う可能性も考えると varつけなきゃいけない気もしてくるし jsのサンプルってみんなそうなってる気がする 俺の気のせいじゃなければjsって 大規模プログラム向いていないし、小規模スクリプトも向いてなくね?
- 91 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:36:27.32 ]
- >>90
外のスコープの変数にアクセスする場合は、つけないし、 そうじゃない場合はつければよい。何も悩む必要は無い。 変数の最適なスコープは常に一つしかないのだから、それに準じればよい。 外のスコープで同名の変数が有るか無いか気を配らなければならないRubyや、 代入の有る無しでスコープが切り替わってしまうPythonなんかに比べれば、 遥かに単純で、考えることは少ない。 スコープ以外のことに関してで、RubyやPythonを持ち上げて、JSをこき下ろす事は結構だけど、 ことスコープに関しては、それは無理。 ただ、JSのスコープの仕様が特に優れているというわけでもないが。 RubyとPython、特にPythonの仕様が異端で、どうかしているってだけの話なので。 JSのスコープのやり方は他の言語でも見られるスタンダードなものだし、 当たり前のことを当たり前にやってるだけ。 難点を挙げるとすれば、ブロックスコープが無いことか。まぁRubyやPythonにも無いんだけどね。
- 92 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:44:16.41 ]
- ただ単にvarかくのが面倒くさいって話だよ
変数宣言が必要になる時点で小さなスクリプトを書くのにjsは向いていない かといって >結論から言うと、言語設計時に大規模開発を想定していた >PythonやRubyといった他のLLと比較して、JSは大規模開発に向いていない。 こういう事情もあるから大規模開発にも向いていない あ、ゴミか^^; rubyを知らない知ったかゴミカス野朗みたいだけど、rubyにブロックスコープはある
- 93 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 12:48:57.94 ]
- >rubyを知らない知ったかゴミカス野朗みたいだけど、rubyにブロックスコープはある
他の言語で言うところのブロックスコープだ。
- 94 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 13:18:03.83 ]
- 君の知識レベルで他言語ディスるの無理
- 95 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 13:46:22.71 ]
- 初心者死ね
- 96 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 16:52:09.34 ]
- hirata-create.toypark.in
- 97 名前:デフォルトの名無しさん mailto:sage [2012/08/13(月) 17:28:35.80 ]
- .NET,ASP,PHP,javaこの辺の言語を何れもやれって会社は大した技術者が居ない糞会社
- 98 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 07:24:16.04 ]
- Lispのスコープも最初は問題があったがSchemeで解決した
Smalltalkの影響を受けた言語は今でもスコープがおかしい
- 99 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 07:55:53.88 ]
- >>98
Prologにスコープはないな。
- 100 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 08:14:25.83 ]
- >>99
繰り返しは?
- 101 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 08:53:56.63 ]
- Prologにはブロックが無いよな
Cでも if (foo && bar && ……) return 1; のように書ければ{}はほぼ無くなるし
- 102 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 08:54:26.78 ]
- スコープについてはRubyもPythonもPHP大きな差はないかな。
ブロックスコープなのはPerlだけでしょ。 それでもJSの場合、名前空間もなければClassもないので、一番分かりづらいというのはあるね。
- 103 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:04:12.85 ]
- >>98
どうおかしいの?
- 104 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:16:09.79 ]
- >>100
繰り返し構文がないのだから、「ない」と言い切っていいんじゃないか。 仕様が「繰り返せ」の場合は再帰で表現するのだが、これも、繰り返しとも 読める、くらいの解釈でいい。節と節がバラバラに主張していて先ずその主張の 核心を「宣言的に」読み取るのがPrologなのではないか。仕様の繰り返しを陽に するには、述語名で「・・・を繰り返す」とはっきり述べるのが一番よいだろう。
- 105 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:33:09.22 ]
- >>103
RubyもPythonも大きな差はないとか言われてもスルーしてる時点でおかしいだろ
- 106 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:44:51.21 ]
- さらっと流されてるが、>>86とか>>91のJSに関する説明はちょっとおかしいよね?
{i=0; {var i=1;} } とかしてもJSにはブロックスコープは無いから外側のiと内側のiは同じものになってしまう var宣言を単純にブロックの内側と外側の変数を区別するものには使えない JSでブロックスコープ的なものが使いたいときはブロックの代わりに無名関数でくくらないと {i=0; (function(){ var i=1; })(); }
- 107 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 10:20:58.13 ]
- あーそれは擬似コードだから。
PythonとRubyとJSでそれぞれ記述が違うので、 {{}}で、ネストスコープ一般を表現したってだけ。
- 108 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 10:28:50.69 ]
- JSのスコープのネストは関数スコープで作る前提の話なのか
たしかにブロックのスコープとは書いてないね
- 109 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 10:59:07.14 ]
- うんこな言語集めてどっちがマシとかマジうけるわ
マトモな言語使いたかったら静的型付け関数型言語でも使ってろ
- 110 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 11:15:01.64 ]
- >>109
スレタイ嫁
- 111 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 11:20:59.96 ]
- Javascriptを読み書きしてると function() がゲシュタルト崩壊する
- 112 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 12:17:19.67 ]
- Perlよりマシといえば大抵のことが許される雰囲気があった
実際にはPerlに勝ったとか負けたとか考えない言語のほうがマシだった
- 113 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 16:44:44.54 ]
- javascriptとsmalltalkのうんこさはそっくり
- 114 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 22:46:09.32 ]
-
# C 1 for() 2 { 3 コード 4 } # ruby 1 map do 2 コード 3 end do 〜 endより { } のほうが、読みやすいことが分かった
- 115 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 22:52:33.16 ]
- >>113
smalltalk風の開発環境でDOMやhtml5を弄れるruby処理系なんてあれば最強じゃね?
- 116 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 22:58:15.05 ]
- Smalltalk処理系を流用した
Ruby処理系(MagLev)ならあったが……
- 117 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 23:31:05.55 ]
- >>114
ハア? irb(main):001:0> [1,2,3].each { |x| p x } 1 2 3 => [1, 2, 3]
- 118 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 00:44:10.32 ]
- codejamってjavascriptだけハブられてるのね
PHPからclojureまであるのに
- 119 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 07:29:06.13 ]
- JSの良さは、熱心なファンがいないってところでもあるからな。
勝手に広まって勝手に定着したから。
- 120 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 08:37:53.53 ]
- Javascriptのファンなんて希少種だろ
他言語からJavascriptへコンパイルするのが流行り 直接Javascript書くのは低能
- 121 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 09:00:24.91 ]
- >>120
定着しないのが特徴かな。実行環境が不安定過ぎた。 一時熱中して、そして去っていく。だから、プログラマ数も増えない。
- 122 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 09:31:59.66 ]
- >>120
今後は、これまでの軽量言語を抑えて最大になると思うけど githubは既にjsの登録数がrubyを越えている そして、熱心なファンは海外ではninjaだとか言われてるみたいだぞ
- 123 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 09:42:35.15 ]
- >>121
TIOBE INDEX がそれを物語っているね。みんなJSはもっと 使われてるでしょって言う。使ってみた人の数は多いが、 現時点での活性はやはり検索数のようなものに出てしまう。
- 124 名前:デフォルトの名無しさん [2012/08/15(水) 11:16:18.20 ]
- jsがどこで流行ってるのかわからない
あれがブラウザ以外で使えると思ってる子はちょっとな ブラウザ用に作られてる言語だからそれを外に引っ張り出してきても コーディング自体が楽になるようなシンタックスシュガー系の拡張は何もやってくれないと思うよ そんな言語で頑張りたければどうぞ
- 125 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:26:01.35 ]
- >>124
Ajaxは流行ったと思うけど、それでもダメだった。きびしいですね。
- 126 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:29:37.61 ]
- ここはどんだけガラパゴスですか
- 127 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:33:37.84 ]
- どうであれ、ブラウザでは生き残るから、
流行り廃りに関係ない、息の長い言語になるだろうね。
- 128 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:39:35.25 ]
- >>126
www.tiobe.com/index.php/paperinfo/tpci/JavaScript.html
- 129 名前:デフォルトの名無しさん [2012/08/15(水) 12:01:49.91 ]
- まあブラウザに多言語乗っける流れがくるよ
その時がjsの終わり
- 130 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 12:17:02.89 ]
- Googleが乗せようっていうとMSは嫌だって言うだろうし、
MSが乗せようっていうとAppleが嫌だって言うだろうし、 なかなか標準の規格に入らないんじゃないかね。 別に規格外でも、互換性糞食らえで乗せたきゃ勝手に 乗せればよいんだが、特定のブラウザでしか動かないのでは 普及するわけ無いし。 やっぱり足並み揃えない取って事で、 新バージョンのJSが乗っかって終わりでしょう。
- 131 名前:デフォルトの名無しさん [2012/08/15(水) 12:26:28.68 ]
- >>129
今以上にカオスになるな クロスブラウザ対応不可能になる
- 132 名前:uy [2012/08/15(水) 13:14:53.16 ]
- これから苦労してjsをマシな言語にさせていくよりは他言語入れたほうが早い
- 133 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 13:16:51.90 ]
- たとえそうでも、他の言語をねじ込むのは無理。
Appleが提案してもGoogleとMSは反対する。
- 134 名前:uy [2012/08/15(水) 13:30:47.00 ]
- ruby2.0はChromeで動く可能性が高い
- 135 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 13:40:46.02 ]
- はぁ、NaCLね。はいはい
- 136 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:10:15.96 ]
- またuyがRuby関係のスレをage荒らしてるな。
議論に負けるといつもこれだ。
- 137 名前:uy mailto:sage [2012/08/15(水) 14:18:24.05 ]
- IronRubyは存在する
IronJavaScriptは存在しない
- 138 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:23:07.71 ]
- .NetならC#だろ。バカじゃね。
同様にブラウザで動かすならJSだがな。 RubyはPythonともろに食い合う不幸な運命。
- 139 名前:uy mailto:sage [2012/08/15(水) 14:25:59.58 ]
- えっ
ynupl.com/reddam/archives/155 こういう使い方だと思うけど なんだと思った? Scala(笑)がJavaのクラスを継承できます(キリッ)とかいってたけど それと同じ
- 140 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:33:23.30 ]
- まずさ、Rubyを普及させたいのなら、何かツールを作ったら?
C言語はOSを作るために作った言語だし、 JSはネスケ社がブラウザ作る片手間に作った言語だし、 JavaはJavaVMと一蓮托生だし、 C#は.Netのために作った言語。 だからさ、Rubyも普及させたいのなら、marzに頼んで、 社会の基盤になってしまうような、革新的超便利ツール作ってもらって、 その組み込みスクリプト言語としてRuby乗せれば? 言語だけ作って後はポイ投げってのはダメ言語の典型なんだよ。 むしろツールの作成を本業とし、そっちの普及を目的とすべし。 言語開発なんかは、必要に迫られて、傍らでするぐらいでよい。 普及してて人気のある言語はほとんどそう。 ツールに引っ付いて勝手に広まった。
- 141 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:36:53.30 ]
- Rにくっついて広まるかも。
shop.oreilly.com/product/0636920022626.do
- 142 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:40:36.21 ]
- >>137
えっ ja.wikipedia.org/wiki/JScript#JScript_.NET
- 143 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:43:17.24 ]
- >>140
元がPerlに不満を持ったMatzが書き上げたオレ言語がRubyなので 実際今でも一番多い使い方が たぶんシェルスクリプト・Perl・make辺りの代替でしょ プロダクト未満の小物が本来の主戦場 ただ、何か知らんが一部のハッカーの琴線に触れるものがあるらしく RailsやらRedmineやらMetasploitやら 一線級のソフトも出てきた、というのがここ5年ぐらいの話
- 144 名前:デフォルトの名無しさん [2012/08/15(水) 15:07:36.87 ]
- (*´・∀・)(・∀・`*)ヘー
- 145 名前:uy mailto:sage [2012/08/15(水) 15:10:21.84 ]
- Rubyはまだまだ歴史が浅い
- 146 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:17:03.87 ]
- Rubyはなんでdoに|つけるの?
- 147 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:19:13.66 ]
- たしかJavaと同時期のリリースだったよね。
- 148 名前:uy mailto:sage [2012/08/15(水) 15:23:41.39 ]
- どうしてこんなに差がついたのか。
- 149 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:39:44.61 ]
- >>146
パイプでブロック引数をはさまないと、 それがブロック引数なのか、 単に式としてそこにあるのかが区別できない
- 150 名前:uy [2012/08/15(水) 15:42:23.84 ]
- クソ仕様ですみませんwww
- 151 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:46:24.88 ]
- >>149
pythonみたいな for t in list: みたいにできなかったの? 絶対にこっちのほうがわかりやすいと思うんだけど||でかこったら特殊な演算やってそうじゃん
- 152 名前:uy mailto:sage [2012/08/15(水) 15:48:47.94 ]
- >ただ、何か知らんが一部のハッカーの琴線に触れるものがあるらしく
ていうか、何で分からないのか分からない 最初から最後までオブジェクトで出来てる時点でさ if true 5 end.times do | n | p n end こう、IFの戻り値さえそのままメソッドチェインで使えるんだけど
- 153 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:49:51.63 ]
- >>151
for t in list; end という構文も最初から存在していますけど、なにか?
- 154 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:54:31.43 ]
- >>152
Rubyにおいて if や case といった条件分岐は 文(statement)ではなく式(expression)だから これはSmalltalkも同じ 手続き型言語として見れば異端だけど、 関数型言語として考えれば実に自然なプログラミングができる
- 155 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 16:03:00.24 ]
- >>153
なんであんまりrubyではその構文使わずに使わずにeach doするの?
- 156 名前:uy mailto:sage [2012/08/15(水) 16:22:03.27 ]
- for文()よりもeachの方がメソッドチェインできて最強だからだよ
- 157 名前:uy [2012/08/15(水) 16:23:28.48 ]
- メソッドチェインってなにがいいの?
- 158 名前:153 mailto:sage [2012/08/15(水) 16:26:13.52 ]
- >>155
おそらく列挙オブジェクトへブロック付きメッセージを送るという Smalltalk流のオブジェクト指向スタイルが好まれるからだと思う for構文は手続き型スタイルであり、PerlやPythonから移ってきたばかりの Ruby初心者は、最初for構文を使うけど、Rubyを深く知るにに従って (forよりも柔軟な)オブジェクト指向スタイル、つまりRubyらしい プログラミングスタイルを身につけていく
- 159 名前:uy mailto:sage [2012/08/15(水) 16:39:40.59 ]
- メソッドチェインの有用性から説明しないとダメな奴がいるの?
- 160 名前:153 mailto:sage [2012/08/15(水) 16:42:30.15 ]
- >>157
メソッドチェインに関しては過去スレで話題になったけど、 最大の利点は左から右へと流れる、自然に読み取れるコードが 書けることだと思う
- 161 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 16:42:44.79 ]
- 柔軟な例とかない?
- 162 名前:uy mailto:sage [2012/08/15(水) 16:52:58.51 ]
- rubyで一番よく使うのはmap、これは戻り値に配列を返す
普通に書いたら p [1,2,3].map { |x| x*2 } # => [2, 4, 6] だけど、メソッド(イテレータ)チェインする事によって、本来配列を返さない each_with_indexなども p [1,2,3].each_with_index { |x,i| x*(2+i) } # => [1, 2, 3] mapを置く事による戻り値を変えられる p [1,2,3].each_with_index.map { |x,i| x*(2+i) } # => [2, 6, 12] これをforで書くとこう s = [] i = 0 for x in [1,2,3] s << x*(2+i) i += 1 end p s for文とイテレータじゃ力の差が有りすぎて異論の余地すらない
- 163 名前:153 mailto:sage [2012/08/15(水) 17:05:47.91 ]
- >>161
たとえば「あるリストを選別してソートして計算して書き出す」という お題の場合、以下のような破壊的代入の無い流れるようなコードが書ける list.select { .... }.sort { .... }.map { .... }.each do; .... end もしRubyにfor構文しか存在しなければ、一時変数をゴリゴリと更新していく ループ処理を並べた典型的な手続き型コードになる
- 164 名前:uy [2012/08/15(水) 17:19:49.47 ]
- つまり、書き方がちょっと変わっただけである。
- 165 名前:uy [2012/08/15(水) 17:21:52.02 ]
- 実際は
list.select { hoge hoge hoge hoge hoge hoge }.sort { hoge hoge hoge hoge hoge hoge }.map { hoge hoge hoge hoge hoge hoge }.each do; hoge hoge hoge hoge end となって見難いのである。 だから縦に流れるようなコードにしたほうがいい。 list.select { hoge hoge hoge hoge hoge hoge } list.sort { hoge hoge hoge hoge hoge hoge } list.map { hoge hoge hoge hoge hoge hoge } list.each do; hoge hoge hoge hoge end
- 166 名前:153 mailto:sage [2012/08/15(水) 17:28:12.26 ]
- >>165
文が1行で収まらなければ、改行とインデントを使って 上から下へ流れるコードを書けばいい 工夫すれば、実用的なプログラムでもすべて80桁以内になるよ list.select { hoge hoge hoge }.sort { hoge hoge hoge }.map { hoge hoge hoge }.each do hoge hoge hoge end
- 167 名前:デフォルトの名無しさん [2012/08/15(水) 17:28:58.74 ]
- >>> [val*(2+idx) for idx,val in enumerate(sorted([3,2,1]))]
[2, 6, 12] メソッド入れ子でもいいんちゃう?
- 168 名前:153 mailto:sage [2012/08/15(水) 17:44:23.49 ]
- >>167はPyhon自慢のリスト内包表記だけど、
同じ計算は、Rubyであれば(>>162を少しだけいじって) 左から右へと流れるコードになる irb(main):001:0> [3,2,1].sort.each_with_index.map { |x, i| x * (2 + i) } => [2, 6, 12] さて、どちらが読みやすいと感じるかな?
- 169 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 17:53:53.31 ]
- 読みやすさで言えば、一時変数を用意するやり方だろう。
- 170 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 17:58:45.01 ]
- それはペチパー君が慣れてないだけです
- 171 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:05:30.28 ]
- 慣れ言い出したら、それで全て解決だな。
- 172 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:07:20.33 ]
- 自転車こぐのも慣れが必要だよ
- 173 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:08:42.47 ]
- >>168
どうみてもPythonのほうが読みやすい
|

|