Ruby 初心者スレッド Part 60 [無断転載禁止]©2ch.net

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2017/04/29(土) 02:01:58.34ID:urVXnFrH
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 59
http://echo.2ch.net/test/read.cgi/tech/1475394638/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/

0952デフォルトの名無しさん2017/08/24(木) 12:21:31.80ID:NrLz+nwx
DSLに何言ってんだか
Rubyの書きやすさ書き換えやすさは他の言語にない重要なポイントのひとつだろ

0953デフォルトの名無しさん2017/08/24(木) 12:32:10.15ID:5a7RKQDl
>>952
意味不

0954デフォルトの名無しさん2017/08/24(木) 14:28:41.04ID:gfjynZsV
>>948
静的型とか動的型とか全く関係ない

>>945
マニュアルくらい読もうぜ
Array#+ は self + other -> Array
https://docs.ruby-lang.org/ja/2.4.0/method/Array/i/=2b.html

pryでshow-doc, show-sourceすればすぐ分かる内容
show-source Array#+

>>951
言いたいことはわかるがArrayを派生したい場合だってある
Rubyはそういうことを制限しない言語
そのかわりに相応の力量が求められる

0955デフォルトの名無しさん2017/08/24(木) 14:56:19.91ID:gfjynZsV
Arrayから直接派生させるよりも、
EnumerableやForwardable使うほうが普通だとは思うけどね

0956デフォルトの名無しさん2017/08/24(木) 15:12:33.89ID:+u51O4Tc
結果収束的には「可能ではあるが極力行わないようになる」こと自体は間違いはない
なんでもかんでもメソッドチェーンにしないのと似たような感覚
ただし(古い表現だが)足元を弾痕穴だらけにしないとわからない感覚なので、未経験者に最初から指示するようなものでもないな
それはそれで「本当は何もできないやらないわかっていない」机上の人だろう

0957デフォルトの名無しさん2017/08/24(木) 15:38:18.44ID:NrLz+nwx
DSLに何言ってんだか
Rubyの書きやすさ書き換えやすさは他の言語にない重要なポイントのひとつだろ

0958デフォルトの名無しさん2017/08/24(木) 16:33:57.27ID:gfjynZsV
>>956
Arrayを継承したいと考えた理由次第だろ

モンキーパッチ、リファインメント、継承、コンポジション
それぞれメリットデメリットあるんだから初心者であっても
そのトレードオフが理解して自分で判断できるようにならないとダメだよね?

基本クラスであってもどういう方式を選ぶのがいいのかは状況次第だから
背景理由を無視して、一つの選択肢を採用したほうがいいっていうのはちょっとっ極端に感じるよ

0959デフォルトの名無しさん2017/08/24(木) 20:44:43.22ID:tqCPVr7b0
🐒

0960デフォルトの名無しさん2017/08/24(木) 20:49:02.11ID:tqCPVr7b
>>954
仮にArrayを継承させたとして
何かのメソッドで思っていた型と違う型が返ってきたとして
静的型ならコンパイルエラーになって即気づける可能性が高いよね
せっかく>>945がRubyが動的型のせいで
> 長い間気づかずどつぼにハマッてたのを思いだした
って告白してくれてるのに

あるメソッドが、どのような仕様になってるかなんて
そんなものはどのような仕様にでも実装できてしまうわけで
(そう書けばそう動く、というだけ)
大事なのは、勘違いしたとき、間違ったときに、直ぐに気づけるかどうか

だからArrayを継承すべきじゃないとかってのは話の本質じゃなくて
長い間気づかずドツボにハマってたのは何故かって部分なんだよ

0961デフォルトの名無しさん2017/08/24(木) 20:50:35.58ID:tqCPVr7b
俺みたいなののほうがマトモなこと言ってるのがもう不思議なぐらいだろ?

0962デフォルトの名無しさん2017/08/24(木) 20:50:57.98ID:tqCPVr7b
それぐらいダメってことなんだよ、言語もコミュニティーも

0963デフォルトの名無しさん2017/08/24(木) 21:04:10.31ID:sQWhHmgZ
はいはいNGNG

0964デフォルトの名無しさん2017/08/24(木) 21:37:49.84ID:gfjynZsV
>>960
言語を使う側の能力の問題を
全部言語のせいにしちゃだめだよ

var result = myArray1 + myArray2

↑みたいに型推論使ってたら似たような事起きるだろ
それは型推論自体がダメだからなのか? 型推論使用禁止にする?
使う道具のメリットデメリットをちゃんと理解して使いこなせてないからだろ

静的型にメリットがあるのはわかるが結局それはトレードオフなんだよ
何を選択するかの問題

0965デフォルトの名無しさん2017/08/24(木) 21:46:32.32ID:tqCPVr7b
その場合でもresultをどこかに渡したり
継承で拡張したメソッドを使ったり
実用的なことをしようとした瞬間にコンパイルエラーになる
お前はそのresultを何も使わずにそのまま捨てるのか?
結局、現実的な部分が全くないんだよね
机上の空論、それがRuby

0966デフォルトの名無しさん2017/08/24(木) 21:51:04.51ID:tqCPVr7b
しかも俺は
>気づける可能性が高いよね
とも書いてるわけで
現実的にはどこかの段階でコンパイルエラーになる可能性が高い、と

0967デフォルトの名無しさん2017/08/24(木) 21:55:21.82ID:Z79NM4TL
スレッドの進行を妨害するのは止めてください
みんなが迷惑を被っています

0968デフォルトの名無しさん2017/08/24(木) 21:56:03.09ID:yIhxd10m
コンパイルが通ってもその後テストを走らせることになるけどな

0969デフォルトの名無しさん2017/08/24(木) 22:02:02.88ID:gfjynZsV
>>965
オーバーライドしたメソッド呼び出してもコンパイルエラーにならないだろ
静的型でも同じこと十分起こりえるよ

運良くコンパイルエラーで拾えるケースだけ上げて
静的型使うべきなんていう主張はナンセンス

力量が低いやつは静的型選んだほうがいいよっていうアドバイスなら
まだ理解できるけどね

0970デフォルトの名無しさん2017/08/24(木) 22:05:10.57ID:Z79NM4TL
再三にわたり伝えましたが、もう一度
スレッドの進行を妨害するのは止めてください
みんなが迷惑を被っています

0971デフォルトの名無しさん2017/08/24(木) 22:10:19.62ID:tqCPVr7b
起こりえるが、可能性は低いわけだ
運良くコンパイルエラーで拾える、というより
運悪くコンパイルエラーで拾えないケースもありうる、ということ

運が良くないとコンパイルエラーで拾えないんなら
静的型言語はこんなに普及してないし、もてはやされてもない
現実が全く見えていないんだね

0972デフォルトの名無しさん2017/08/24(木) 22:10:38.73ID:kEm5qs8H
>>967
LLスレで相手にされなくなったからな
隔離スレの自覚持って欲しいもんだ

0973デフォルトの名無しさん2017/08/24(木) 22:13:45.33ID:gfjynZsV
>>970
「だから動的型はダメなんだ」とか思っちゃう初心者が出ないように
きちんと反論しとくことは重要じゃねーの?

>再三にわたり伝えましたが、
って>>967の1回だけじゃんww

0974デフォルトの名無しさん2017/08/24(木) 22:18:05.33ID:lIOBscyk
>>973
私たちにとってはなんら重要ではありません
お帰りください

0975デフォルトの名無しさん2017/08/24(木) 22:19:22.21ID:gfjynZsV
>>971
型推論禁止すれば運悪くコンパイルエラーで拾えないケースも潰せるね

0976デフォルトの名無しさん2017/08/24(木) 22:20:59.16ID:gfjynZsV
>>974
なんでお前が勝手に決めてんの?

0977デフォルトの名無しさん2017/08/24(木) 22:23:28.89ID:lIOBscyk
>>976
あなたにはもうそれを判断できるだけの客観的知性が残っていないからです

0978デフォルトの名無しさん2017/08/24(木) 22:26:09.58ID:yIhxd10m
>>969
力量が低いだけに留まらず、現実逃避する頭の悪い知ったかぶりのお馬鹿さんなら
あなたが話しかけてるそこにいますよ

0979デフォルトの名無しさん2017/08/24(木) 22:39:55.72ID:tqCPVr7b
俺が言うのもなんだけど
ID:Z79NM4TLやID:lIOBscykのが正解だと思うよ
「そんなことは初めから分かってて承知の上で使っているのだから
 放っておいてくれ」
って所でしょ
欠点を認められずに使ってる方が異常

0980デフォルトの名無しさん2017/08/24(木) 23:09:32.94ID:Z79NM4TL
スレッドの進行を妨害するのは止めてください
みんなが迷惑を被っています
スレッドの趣旨が分からないなら1を読んで下さい
これ以上妨害を続ける場合は、過去の妨害行為時のログを元に弁護士との相談の上、
措置を取ります

0981デフォルトの名無しさん2017/08/24(木) 23:11:07.39ID:h4EzWrOx
自分が何をしてるか全く理解できないんだろうな
レスがつくことそのものに興奮してここがどこかも判断できていない

貴方達そのものを我々は必要としていない
貴方達が書き込んだそのものを私たちは歓迎しない
我々私たちの望みはひとつだけ、二度とここに来るな

0982デフォルトの名無しさん2017/08/24(木) 23:27:57.47ID:tqCPVr7b
何か映画とかで、スラム街とか田舎町の住人に言われそうなセリフ

0983デフォルトの名無しさん2017/08/24(木) 23:38:06.01ID:Z79NM4TL
スレッドの進行を妨害するのは止めてください
みんなが迷惑を被っています
スレッドの趣旨が分からないなら1を読んで下さい
これ以上妨害を続ける場合は、過去の妨害行為時のログを元に弁護士との相談の上、
措置を取ります

0984デフォルトの名無しさん2017/08/24(木) 23:39:36.79ID:c/yv4qcw
過去のgem配布サイト復活しないかな

0985デフォルトの名無しさん2017/08/25(金) 05:58:03.30ID:ZShOFEd5
「Effective Ruby」項目21にも書いてある

コアクラスを継承するな。委譲・包含(Forwardable)を使え。
is-a よりも、has-a を使え

たいていの言語では、String型なども継承できない。
final 指定されてる

初心者は、コレクションを継承したがるが、アンチパターン。
継承すれば、バグるだけ

たいていの「Effective 何々」とか、デザインパターンの本にも、書いてある

0986デフォルトの名無しさん2017/08/25(金) 06:40:42.06ID:aRYPlL4U
>>981
例の人は自分が来るせいで誰も居なくなったんだってわかってないからな
コミュニティは衰退したのではなく特定の人物の書き込みにより破壊されたのだ

0987デフォルトの名無しさん2017/08/25(金) 07:08:25.93ID:w/d6Mddl
Arrayのような多くの人が慣れ親しんだインタフェースを提供したいと考えてるんだが、
それ自体が慣れで運用してしまうから問題、ということなのか?
極端な話myaddとかにした方がいいのか

0988デフォルトの名無しさん2017/08/25(金) 07:24:38.55ID:w/d6Mddl
>>985
アンチパターン名は?

0989デフォルトの名無しさん2017/08/25(金) 10:40:58.89ID:ZShOFEd5
JavaScript の、prototype.js なども、コアクラスを上書きして、挙動が変わるから、
皆から、うっとうしがられてる

とにかく、バグるから、個人で、コアクラスを修正してはいけない

やってもいいのは、Date クラスに、便利な関数を追加したり、
Rails とか、使用説明書・メンテナンスもしっかりしている、
有名なフレームワークだけ

0990デフォルトの名無しさん2017/08/25(金) 11:07:17.19ID:8cxOpMBd
↑こいつはRuby畑の人間じゃないな

0991デフォルトの名無しさん2017/08/25(金) 11:27:54.95ID:BwHFndLq
>>985
項目21の根拠はなんでしょう?

1. 継承を使うとなるとSuper Classの詳細を知る必要がある。
2. 移譲なら使いたい機能をつまみ食いすれば良いので楽。

こう言う事でしょうかねぇ?

09929852017/08/25(金) 12:26:40.27ID:ZShOFEd5
例えば、親のArray から、子のDerivedArray を派生させて、
reverse を呼んでも、子クラスを返さず、親クラスを返してしまう

全メソッドを、派生クラスに対応させるのが、無理だから

委譲で、Forwardable モジュールの、def_delegators で、
使うメソッドだけ、宣言する方が簡単

漏れも、10言語以上、数十冊の本を読んでるけど、
配列など、コアクラスを継承した、ソースコードは見た事がないし、
たいていの言語で、継承よりも委譲を使うように書いてある

そういう論文も多い

0993デフォルトの名無しさん2017/08/25(金) 12:36:03.24ID:BwHFndLq
>>992
ところで、論文はどのJournalから?

09949852017/08/25(金) 13:01:27.87ID:ZShOFEd5
「c++ 継承 委譲」で検索!

ほとんどの論文が、継承よりも委譲

0995デフォルトの名無しさん2017/08/25(金) 15:26:58.12ID:W3qddKKH
クロージャーつかおう

0996デフォルトの名無しさん2017/08/25(金) 15:28:23.63ID:sLUvaIRs
a=[[1,2],3,4,5,[6,7],8,[9,10],[11,12],[13,14]]
b=[[1,3,4,5,6,8,9,11,13],[2,3,4,5,7,8,10,12,14]]
aの配列からbの配列を作り出すにはどの様にしたらいいでしょう?

0997デフォルトの名無しさん2017/08/25(金) 15:32:56.84ID:BwHFndLq
>>996
>a=[[1,2],3,4,5,[6,7],8,[9,10],[11,12],[13,14]]
まずは、
a=[[1,2],[3, 3],[4,4],[5,5],[6,7],8,[9,10],[11,12],[13,14]]
を作る。

0998デフォルトの名無しさん2017/08/25(金) 15:36:12.98ID:BwHFndLq
ar = []
a.each do |e|
if !e.instance_of?(Array) then
ar << [e, e]
else
ar << e
end

まずはこんな感じ!

0999デフォルトの名無しさん2017/08/25(金) 15:50:59.00ID:4MOWRfGQ
>>996
b = a.each_with_object([[],[]]) {|(x, y), acc| acc[0] << x; acc[1] << (y || x) }

1000デフォルトの名無しさん2017/08/25(金) 16:00:09.35ID:HsL9LVKJ
次スレ
Ruby 初心者スレッド Part 61
https://mevius.2ch.net/test/read.cgi/tech/1503644351/

10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 118日 13時間 58分 11秒

10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php

レス数が1000を超えています。これ以上書き込みはできません。