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にシングルトンパターンは存在しないようだ。」 面接官「帰れよ。」
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のほうが読みやすい
174 名前:デフォルトの名無しさん [2012/08/15(水) 18:15:01.60 ] .map{|x| x*2}. みたいに続いていく構文が若干分かりにくいんだよね {}で囲まれてると関数に見えるし ||も引数なのかなんなのか謎だし まあ慣れなんだろうけど
175 名前:153 mailto:sage [2012/08/15(水) 18:21:38.11 ] >>173 >>168 のRubyコードを第三者へ説明しようとしたら リスト定数をソートしてから添字付きで列挙し、各要素の計算値で写像する と、左から右へと流れるコードの構成に沿って記述できる これはトイプログラムに限らず、>>166 のような長く大きなコードでも同じ さて、>>167 を第三者へ説明しようとすれば、どんな文章になるかな?
176 名前:153 mailto:sage [2012/08/15(水) 18:25:51.31 ] >>174 関数に見えるというか、無名関数という関数そのものだよ lambdaのような予約語が省略されているだけ
177 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:40:16.04 ] だから、分かりやすいのがよいなら、 一時変数用意すればよいだろ。何の説明も要らなくなるよ。
178 名前:uy mailto:sage [2012/08/15(水) 18:46:19.62 ] はーーー ばぐった Rubyごみかす
179 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:46:32.63 ] 短くて分かりやすいのがベストだよね!
180 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:58:34.52 ] Smalltalkの #(1 2 3) collect: [:x | x*2] って書き方をパクってこなければ どっちかっていうとPythonっぽいこっちの文法のままだったんだろうな。きっと。 do [1,2,3].map using x; x*2 end
181 名前:153 mailto:sage [2012/08/15(水) 19:14:29.25 ] >>177 一時変数は悪ではないし、否定しないよ 実際に実用的なプログラムでは、あまりに長いメソッドチェーンを 途中で切って、間に一時変数を入れることがある ただし、一度代入したら二度と更新しない 問題は変数の「破壊的代入」 たとえば>>162 の最後にあるforを使った手続き型スタイルでは、 最初にリスト変数とループ変数に初期値を代入した後、 forループ内でこれら変数をゴリゴリと更新(破壊的に代入)している これが可読性の悪化とコード品質の低下をまねく要因 なお破壊的代入の無さは、専門用語だと「参照透明性」と呼ばれる
182 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 19:25:04.95 ] 破壊代入が嫌いなら、手続き型言語の世界から去ってもらうしかないね。 表面のコードに表れて無いだけで、結局mapの中で破壊代入しているのだから、一緒だよ。 書いてある場所が違うだけで、本質的な動作が同じなのだから、危険度も同じ。
183 名前:uy mailto:sage [2012/08/15(水) 19:34:44.27 ] ライブラリや言語処理系側に破壊的操作をさせるのと、 自分で直に破壊的操作を行う処理を書くのは全然危険度が違うよ
184 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 19:39:26.70 ] だったら、関数型言語の参照透過性のメリットなど何も無いって事だな。 破壊的代入は全てライブラリにやってもらえば安全なのだから。
185 名前:uy mailto:sage [2012/08/15(水) 19:43:25.26 ] 頭悪いね
186 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 19:45:30.24 ] >>114 ブロック内の処理が一つの場合は{}で複数処理はdo end がいいってじっちゃが言ってた
187 名前:uy [2012/08/15(水) 20:20:56.63 ] 長く書くとわかりやすいって考える奴居るよなw 数学でも長い式を 一時変数に代入するのにな。
188 名前:デフォルトの名無しさん [2012/08/15(水) 20:22:00.55 ] do | o | ってやったら外人に笑われた なんで?
189 名前:uy mailto:sage [2012/08/15(水) 20:38:54.52 ] キチガイなんじゃね
190 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:01:43.68 ] >>188 lolはlaugh out loudlyで(笑)と同じように使われるから、笑えよってことだね。英語圏のコミュニティ行くとよくあるよ。
191 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:10:40.01 ] 内包表記が読み難いとか言ってる奴は 数学の素養が無いって自己紹介してることに気付いてないの? かっこわるいから控えた方が良いよ
192 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:13:01.31 ] 集合のアレだと気づくのに半年かかったお
193 名前:uy [2012/08/15(水) 21:19:39.91 ] >>191 でも、実際に読みづらいんだろう?
194 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:27:25.15 ] ブロック記法は任意の(ただし関数引数は一つだけの) 高階関数を記述できる分だけ汎用性があるが、 mapとかfilterとかの組み合わせに関してはリスト内包表記のほうが簡潔になりうる 細かい優劣はあれど、matzは内包表記みたいな専用構文を用意するのを嫌った PythonあるいはHaskellその他のように、頻出する記述に糖衣構文を与えるのは間違っていないと思うが、 Rubyはそれよりもブロック構文による均質性を採ったという事
195 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:40:16.38 ] なんでSmalltlakみたく{ |x| x*2 } をファーストクラスにしなかったの? そしたらもっと簡潔にも均質にもなったのに。
196 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:50:52.54 ] Pythonの内包表記はプログラミング独特の手続き的なところをない交ぜにしてるから 数学の内包表記は読みやすいからPythonのも読みやすいみたいな論法はちょっとしっくり来ないな
197 名前:153 mailto:sage [2012/08/15(水) 21:57:54.67 ] >>191 自分は内包表記が読み難いとは思わないね ただしPythonの場合、局所宣言またはクロージャがないから せっかくの内包表記構文が台無しになっている 過去スレ19,20で議論になったコードを以下に示す ==== Haskell ==== data Option a = None | Some a ys = [fn x | x <- xs] where fn x = let h = if is_first_page x then generate_header else None b = generate_body x f = if is_last_page x then generate_footer else None in (h, b, f) Haskellには局所宣言としてwhere節があるから、関数fnを定義することで 内包表記を含む式をトップダウンに数学っぽく記述できる ==== Python ==== ys = (Document.new(h,b,f) for x in xs for h in [generate_header() if x.is_first_page else None] for b in [generate_body(x)] for f in [generate_footer() if x.is_last_page else None]) このPythonコードが何をしているかどうか、はたして一目で把握できるかな?
198 名前:153 mailto:sage [2012/08/15(水) 22:01:18.03 ] 参考として、>>197 に関するRubyのコードを過去スレからコピペする ==== Ruby ==== ys = xs.map { |x| h = if x.first_page? then generate_header else nil end b = generate_body x f = if x.last_page? then generate_footer else nil end Document.new h, b, f } Rubyには内包表記構文は無いけれど、普通に書ける(実に初歩的なコードだ)
199 名前:uy mailto:sage [2012/08/15(水) 22:05:42.94 ] いやそこは h = generate_header if x.first_page? b = generate_body x f = generate_footer if x.last_page? だろ falseだろうとローカル変数は宣言されるから
200 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:07:42.58 ] >>197 HaskellもPythonも使えるから どっちも楽勝で読める あとHaskellならそのケースだと内包表記じゃなくて map fn xs だな 短いし読み易い
201 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:08:07.08 ] >>195 確かGroobyはそういう仕様だったから、整合性は何とかなるんだろうけど 実際問題として誰も困ってないんじゃないの ブロックがリテラルとして書けたとしても、どっちみちブロック付きメソッド呼び出しの時は ブロックを特別扱いする構文を認めることになるから、特段簡潔になるというほどでも…… いわゆる無名関数を直接操作したいならブロック(Procオブジェクト)ではなくてlambdaが適当で lambdaに関しては1.9から糖衣構文が入った
202 名前:uy mailto:sage [2012/08/15(水) 22:09:14.11 ] Rubyは色々考えながら作っていってる感はあるよね 現在のrubyに>>197 こういうの導入すれば、開発効率は一時的に上がるけど 低脳プログラマは優秀なプログラマが管理してやらないと 意味不明なコード書いて自滅するから 全体パフォーマンスを見れば入れるべきでないものもある
203 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:13:47.89 ] >>197 どっちにしても、酷いコードだ。
204 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:16:27.85 ] メソッドチェインって書いた後から付け足す事って結構あるからね イテレータやループの書き方は統一されてたほうが良い
205 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:17:50.65 ] この辺りはある程度個人の感性だけど 内包表記が多段ネストし始めるのはさすがに勘弁して下さいっていうか 読むのも書くのも面倒じゃない? Haskellはまだwhere節で後ろに押しこみ直すことでトップダウンに読めるから 場合によっては許せるかなあと。少なくとも適切な変数名が条件w
206 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:22:51.19 ] 内包表記が活きるのはイテレートする変数が 複数になったときじゃねーの f n = [(x,y,z) | x <- [1..n], y <- [1..n], z <- [1..n], x^2 + y^2 == z^2]
207 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:31:21.07 ] >>201 どうして? ブロックがファーストクラスなら yield や &block なんて小細工いらなくなるし、 複数のブロックを引数として簡単に渡せるから表現の幅も広がるし、 機能も意味もずっと簡潔になると思うよ。
208 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:32:31.13 ] 内包表記とか参考演算子なみのウンコやん。 Pythonってそんな誰得非効率機能が特徴なの?ウンコやん。 ついでにRubyもウンコやん。 ラムダ式とかevalが使えんコンパイル言語がなんちゃってevalを実装してるようにしか見えん。ウンコやん。
209 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:42:15.44 ] >>207 もっと具体的に実現例を出してもらわないと よく分からない
210 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:48:10.24 ] とりあえずsmalltalkは演算子優先順位すらないクソ言語だから このスレで議論する価値無い Java以下のウンコの中のウンコ
211 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:52:50.85 ] >>197 をPythonで(RubyやHaskellのコード相当で)書くならごく素直に def preprocess(x): h = generate_header() if x.is_first_page else None b = generate_body(x) f = generate_fotter() if x.is_last_page else None return h, b, f ys = [Document(preprocess(x)) for x in xs] じゃないかと。まずリスト内包で書くことはない
212 名前:uy mailto:sage [2012/08/15(水) 22:53:01.74 ] 初心者は消えろ
213 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 23:10:42.33 ] みんな消えたか…
214 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 23:59:55.09 ] >>209 - 複数のブロックをとるメソッド呼び出しを簡潔に書ける [1,2,3].find(lambda{ :not_found }){ |e| e>5 } [1,2,3].find { :not_found }, { |e| e>5 } - ブロックをレシーバーにできる lambda{ :do_something }.should_not raise_error { :do_something }.should_not raise_error - ブロックをとるメソッドの仮引数に前置&が不要になる def meth(&block); other(&block) end def meth(block); other(block) end
215 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:05:36.35 ] -> をタイプする手間すら億劫っていうのは ちょっと病気ですよ Rubyってそういう言語かもしれないけど
216 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:06:27.09 ] >>204 付け足す事もあるけど、途中の処理の内容を変えたり、途中で処理を分岐する事もあるよね?その場合、一時変数を使ってる方がやりやすくない?
217 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:11:36.22 ] >>143 Perl代替で一番成功してるのはPythonじゃない? Rubyの場合、作者の思惑はともかく、現状はほぼRails専用と言っていいのでは。 Railsを便利に使うためのツールはいろいろあるけど、OSだったりミドルウェアから使うようなRuby製のツールってPerlやPythonと比べて全然無いでしょう。
218 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:18:16.38 ] >>214 >- 複数のブロックをとるメソッド呼び出しを簡潔に書ける そういう部分でメソッド引数括弧の省略を使うのは筋悪でしょ 現在のRubyのコーディングスタイルでも、引数がある場合は原則省略しないのが主流 あるいは括弧を省略しない場合、確かにルールは単純だけど見栄えがよろしくない hoge({|x| p x }) そしてブロック構文の仮定として 大部分の高階関数は関数引数を一つしか取らないという 観察結果があるわけだから、一つに特化した構文でも十分
219 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:35:02.92 ] >>217 ここで小物と表現していたのは、ツールと呼ぶのもおこがましいほど小さい 日常の雑務を処理するような小規模スクリプトだよ。ワンライナーも含む 例えばRubyに大量に残ってるPerl譲りの特殊変数とか、 外部コマンドのためにリテラルとか、インタプリタの変な起動引数とか、 色々あるが、おそらく全部そういう小物のためのもの
220 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:43:48.75 ] >>218 しかし関数型言語で圧倒的に利用頻度の高い 関数合成は関数引数を複数取る関数なんだよね (.) :: (b -> c) -> (a -> b) -> a -> c Rubyではブロックとブロックを合成して 新しいブロックを作りたくなることは無いの? xs.map(f).map(g).map(h) を xs.map(f.g.h) と書けたら良いと思わない?
221 名前:uy mailto:sage [2012/08/16(木) 01:00:12.30 ] 俺はrubi使いだけど、ちょっとrubyの考えは改めようかな 言語が複雑なことやってるから、実装もバグ取るのも大変なんだろうし 俺が普通じゃないコード書いてるからなんだけど バグ多すぎてワロタwwww 今日だけで2個踏んだったwwww なんでだろ、世界でずいぶん使ってる奴いるはずなのに、 俺はもういままでrubyのバグには自分で出したのだけで少なくとも10個以上 どうなってるのこの言語 とりあえずlambda周りとハッシュ周りに何かがある・・・
222 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:02:21.44 ] それがパーサのバグなら諦めろ Rubyのパーサはどうもならん
223 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:11:31.94 ] rubi使いはフリガナふってろ。初心者って自分のバグを人のせいにするよな。
224 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:19:03.05 ] >>218 201,209が「簡潔にならない」「具体例がないと分からない」というから挙げた例に 横からしゃしゃり出てきて一例だけピックアップして筋悪とか十分とか 結論ありきの難癖つけるってなんなのあんた?
225 名前:uy [2012/08/16(木) 01:20:06.45 ] > なんなのあんた? 俺俺。俺だよ。
226 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:29:22.60 ] コミュ障です。
227 名前:uy mailto:sage [2012/08/16(木) 01:30:59.89 ] >>223 ひとつは普通に[BUG]ってでた これはlambda周りのバグ もうひとつは、これはハッシュ周り [BUG]とはでないが、 存在しているはずの変数の中身が一定確率で(1度のイテレーションのみ?)だけ勝手にnilになってる nil => nil のハッシュなんか追加した覚えないのに両方nil とりあえずイテレータでまわしてる時に中でこれをやってはいけないっぽい task = Hash.new task.marge(...) task.each do task = 新しいハッシュ end これをどうにかなくしたらバグらなくなった いずれも小さなコードで再現させようとしてもバグってくれない 俺がわけわからんコード書いてるせいもあると思う もういやだ
228 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:35:09.09 ] >>227 中級者はバグを回避するコード書くのがあたりまえっえこと。
229 名前:uy [2012/08/16(木) 01:35:37.63 ] >>227 [BUG]というのは テメーのバグっていう意味だよw
230 名前:uy mailto:sage [2012/08/16(木) 01:36:32.34 ] >>227 あ,ごめんハッシュのほうは両方nilではないわ でも何か動作おかしいのは事実
231 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:42:31.92 ] そりゃお前、コンテナをイテレートしている最中にコンテナいじったら、 危ないだろうJK。Rubyに限らずどの言語でもご法度。
232 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:43:59.81 ] >>224 この一例が重要だから214が例示して、218が反論したんだよ もしブロックが単独のリテラルだったなら 1. Procを簡潔に記述できる 2. ブロック構文に関わる一連の糖衣構文(yield、&block、)が 通常のメソッド引数括弧の省略という形で統一的に記述できる 3. またこの枠組みでは複数の関数引数の記述も自然にできる それに対する反論が 1. 関数型スタイルを使いたいならProcではなくてlambdaでいいじゃん(糖衣構文がある) 2. メソッド引数括弧の省略に頼った記法は良くないとされている 逆に省略しないと記述が煩雑になる。つまり専用構文を用意するのがベター 3. 複数の関数引数は出現頻度が低いことが分かっているから重要でない むしろ一引数に特化している事が重要 →再反論:関数合成のような例は? っていう議論なんだから
233 名前:uy mailto:sage [2012/08/16(木) 02:12:27.19 ] もういいじゃんruby最強なんだから バグがあっても使う価値があるくらいには最強
234 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 08:15:45.11 ] 日本人の韓国旅行終了! 三井住友、韓国旅行者向けの新カード発行延期 engawa.2ch.net/test/read.cgi/poverty/1345036192/ 韓国旅行者向けの新カード発行延期 三井住友カード 三井住友カードは15日、韓国に旅行する日本人向けに予定していた新たなカードの発行を延期すると発表した。 提携する韓国のカード会社と22日にソウル市内で記者発表会を計画していたが、これも延期する。 韓国の李明博(イ・ミョンバク)大統領の竹島上陸や対日批判などを考慮し、「今サービスを始めるのはふさわしくない」(広報室) と判断したという。 このカードは、旅行前に日本円で入金しておけば、韓国のお店で韓国ウォンでの支払いができるプリペイド式で、9月上旬から 発行する予定だった。記者発表会は、日本でも人気の高い韓国人俳優らが出席する計画だった。 www.asahi.com/business/update/0815/TKY201208150428.html
235 名前:153 mailto:sage [2012/08/16(木) 10:04:35.58 ] >>211 ん、最終行にはリスト内包表記が見えるけど、気のせいかな? それはさておき、Pythonでは「ごく普通に」関数を定義して適用するのに対して、 Ruby(および関数型言語)では「ごく普通に」ブロックや無名関数を使って シンブルな式として表現できる、ということになった また当たり前だけど、>>211 のような関数を定義するコードはRubyでも書ける これは>>197 ,198で述べたように、関数型言語風プログラミングにおいて 局所宣言が無いというPythonの欠点、そしてRubyの優位性を示している
236 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 11:03:14.55 ] 無名関数のあるJSの勝利ですね。
237 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 11:05:52.40 ] >>235 Rubyは関数内関数を素直に定義できないじゃん Proc と lambda の違いとかキモイし どさくさにまぎれて関数型言語と一緒にすんなよ
238 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 11:45:22.78 ] phpでの話なんですが教えて下さい あるアドレスに下記の様にHTTPヘッダー関数で移動すると返ってくる内容がブラウザに表示されるのですが header("Location: {$add}") ; file関数、fgets関数等で下記の様に読み込むと中身がカラッポで入っていません $data = '' ; if ($fp = @fopen($add, "r")) { while (!feof($fp)) $data .= @mb_convert_encoding(fgets($fp, 1024), "EUC-JP", "auto"); fclose($fp); } $data = htmlspecialchars($data); file関数、fgets関数等で読み込んで中身を得るにはどうしたら良いでしょうのでか 教えて頂ける様お願いします
239 名前:238 mailto:sage [2012/08/16(木) 12:26:57.50 ] エラー抑制を外してみました if ($fp = @fopen($add, "r")) { ↓ if ($fp = fopen($add, "r")) { そしたら次の様なワーニングが出てきました 『 Warning: fopen(アドレス) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in 動いてるスクリプト on line 374 』 どうもアクセス相手側から拒否されている様です しかしヘッダー関数では取得できる様なのでどうにかしてfile関数等でデータを取り込みたいのですが どうしたら良いかご存知のかたいらっしゃったら教えて頂ける様お願いします
240 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 12:30:36.27 ] >>239 WebProg kohada.2ch.net/php/
241 名前:238 mailto:sage [2012/08/16(木) 12:32:19.66 ] >>240 thx
242 名前:uy [2012/08/16(木) 14:10:29.16 ] rubyは[]でかけるLISPとしても使えるんじゃなかった? メソッド揃えば完全変換できるかもよ procのlambda違いは有りなんだよ rubyは同じに見えて微妙に違う動作をするメソッドが数多く存在する それだけ細かい調整が標準ライブラリで効くってこと
243 名前:153 mailto:sage [2012/08/16(木) 14:13:16.73 ] >>237 >Rubyは関数内関数を素直に定義できないじゃん エッ!、Rubyは普通に関数内関数を定義できるよ??? 以前(1.8)は関数内関数のスコープに問題があったけど、今(1.9)では解消されたし ・メソッド定義のネスト - Ruby 1.9.3 リファレンスマニュアル doc.ruby-lang.org/ja/1.9.3/doc/spec=2fdef.html#nest_method というか、OOPLであるRubyでは、プライベートメソッドとして定義するのが一般的で、 関数内関数はまず目にすることはない しかも(>>211 のPyhtonのような)他LLでは関数定義を「普通」に使うけど、 Rubyならブロックがあるから一度しか適用しない関数は式の中に埋め込むのが「普通」 つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない >Proc と lambda の違いとかキモイし 確かにProcとlambdaの微妙な差異は分かりづらいよね でもRubyにはブロック構文があるから、(Procやlambdaのような)明示的な無名関数宣言を 使う頻度は比較的少ないし、使うケースでもどちらか一方を使えば済むことが多い また、言語の微妙な弱点を避けて、良い点を引き出すことに注力することが (Rubyに限らず)中級プログラマのたしなみの一つだと考える >どさくさにまぎれて関数型言語と一緒にすんなよ え、一度も「Rubyは関数型言語である」とは言ってないけど.....??? 「関数型言語風プログラミングには(他LLよりも)Rubyは明らかに優れている」と主張している
244 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 14:25:57.61 ] >>243 > エッ!、Rubyは普通に関数内関数を定義できるよ??? はあ?じゃあ何で関数内関数が外から見えてんだよ ideone.com/4J057
245 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 14:42:18.11 ] > つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない 関数型言語でも関数内関数を多用するけど...? 「関数型言語風プログラミング」って何? それってただの「Ruby風プログラミング」なんじゃないの?
246 名前:uy mailto:sage [2012/08/16(木) 14:43:56.36 ] rubyの仕組みがなんにもわかってないんだな それは結局selfが省略されているに過ぎない rubyはすべてがオブジェクトであり、インスタンスは特異メソッドをもつ事が出来る self.define_singleton_method :uy do p :uy end お前らの大好きなシングルトン でもこの設計はゴミカスだな 俺様個人の意見を言わせてもらうならdef内のdefは使わないほうがいいよ 普通にlambdaで ->{ } 書いたほうが短いんだからそっち使えばいいじゃん
247 名前:uy mailto:sage [2012/08/16(木) 14:48:03.05 ] >>246 すいません、思いっきり間違っていました忘れてください 旅にでます
248 名前:153 mailto:sage [2012/08/16(木) 14:50:55.63 ] >>244 わざわざideon上のコードを引用しなくても、Rubyの振る舞いは>>243 で示した リファレンスマニュアル「普通のメソッド定義式と同じ」の通りだよ??? 確かに、理想的には内側のメソッドが外部から隠蔽されたほうが望ましいことは認める これが>>211 のPythonコードのように、関数定義を多用するのが「普通」、 あるいは関数定義を多用「しなければならない」言語であれば、致命的な欠陥になる でも>>243 で述べたように、Rubyでは関数内関数の必要性がほとんど存在していないんだ もしも可能であるならば、ブロックやプライベートメソッド定義では読みづらかったり 冗長だったりするけど、関数内関数であれば素直に表現できるコード例を示してほしいなあ...
249 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 14:57:03.42 ] rubyはそこら中が関数といえば関数だからね do 〜 endって、でてきたらそれ全部関数だよ
250 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 15:03:34.35 ] だから関数型言語では関数内関数を多用するって言ってるのに... 関数型言語と違うスタイルなんだから「関数型言語風プログラミング」とか言うなよ
251 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 15:07:46.32 ] > 確かに、理想的には内側のメソッドが外部から隠蔽されたほうが望ましいことは認める 理想的にはじゃなく、ここが一番大事なところ
252 名前:uy [2012/08/16(木) 15:08:18.16 ] proc Proc.new lambda ->{ } def define_method define_singleton_method Module.new / Class.new / Struct.new こんくらいかな?メソッド内で関数のようなものを定義する方法 動作違うものが、これだけあるんだから動作調べて好きなの使えよ? defしか使えないバカなの?