トップページ⇒tech
1002コメント364KB

Ruby 初心者スレッド Part 58 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/03/23(水) 21:16:44.36ID:6HedlyzC
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 57
http://peace.2ch.net/test/read.cgi/tech/1426165733/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0344デフォルトの名無しさん2016/06/16(木) 23:54:18.82ID:neKk6sZN
おおこれすごいな
03453402016/06/17(金) 10:43:12.89ID:SNT89ii+
>>342
お、たすかる。
2.3.1のWindows版バイナリはまだ配布されてないので。
やっぱりバグで、修正されたんやね。
03463402016/06/17(金) 10:45:11.00ID:SNT89ii+
>>343
ぼっち演算の影響かねえ。
直接は歓迎会なさそうだけど。
0347デフォルトの名無しさん2016/06/17(金) 11:50:15.28ID:wk6+tOOo
歓迎会がなんかツボったw
0348デフォルトの名無しさん2016/06/17(金) 12:57:18.13ID:hG7B1m7h
>>340
>nil[0]=0
1.8.7 だと無事エラーになった
0349デフォルトの名無しさん2016/06/17(金) 13:29:02.01ID:WSjlHFjC
ソースが仕様です(キリっ
0350デフォルトの名無しさん2016/06/17(金) 14:21:01.72ID:SYFwm9MP
230のみで起こるバグなのか
231で修正されてるならあんまり気にしなくて良さそうだね
0351uy ◆e6.oHu1j.o 2016/06/17(金) 16:33:46.05ID:GkjZw5OC
質問です

YAMLで読み書きをしてるコードをしばらく動かしていたら
c:/ruby/lib/ruby/2.3.0/psych.rb:377:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 2 column 1 (Psych::SyntaxError)
ロードエラーが出てきて、
ファイル開いてみると確かにデータのインデントが変な風に書き込まれていました(20回分くらいのデータは正常に書き込まれています

読み書きは
YAML.load_file( YAML_FILE )
と
YAML.dump( yaml , open( YAML_FILE , 'w') )
でやっています
間違ったデータを書き込んでる原因は模索中です

YAML.dumpで書き込んだデータが
YAML.load_fileで読めないケースってあるんですか?


書き込まれていたのはこんなデータです
http://echo.2ch.net/test/read.cgi/tech/1458735404/:
uy:
- '9999'
http://echo.2ch.net/test/read.cgi/tech/1458955459/:
uy:
- '9999'
- '2'
http://echo.2ch.net/test/read.cgi/tech/1462970810/:
uy:
- '9999'
- '9999'   ← これが間違って書き込まれているデータ
0352uy ◆e6.oHu1j.o 2016/06/17(金) 16:36:29.12ID:GkjZw5OC
>>351
インデントがおかしくなりました  修正

http://echo.2ch.net/test/read.cgi/tech/1458955459/:
 uy:
  - '9999'
  - '2'
http://echo.2ch.net/test/read.cgi/tech/1462970810/:
 uy:
  - '9999'
- '9999' 
0353デフォルトの名無しさん2016/06/17(金) 17:24:52.68ID:WSjlHFjC
データの方ではなく
再現するソースを貼りなさい
0354デフォルトの名無しさん2016/06/17(金) 17:34:13.83ID:8Hiy7fy+
>間違ったデータを書き込んでる

>YAML.dumpで書き込んだデータが
>YAML.load_fileで読めないケース

>← これが間違って書き込まれているデータ

自分で論理的に原因の切り分けも出来ないくせに原因特定するなんて馬鹿のすることです。
0355uy ◆e6.oHu1j.o 2016/06/17(金) 18:48:19.99ID:GkjZw5OC
>>353
uy式会社uyの守秘義務があるので貼れません

>>354
もう少しわかりやすくお願いします

自分が知りたいのは
YAML.dump( yaml , open( YAML_FILE , 'w') )
↑ の時

変数:yaml にどのような値を入れて .yamlファイルを作成した場合に
この c:/ruby/lib/ruby/2.3.0/psych.rb:377:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 2 column 1 (Psych::SyntaxError)
エラーが出現するかという事ですが
一般的な方法で再現する方法は存在しないという事で良いですか?

いま現在いくつかのエラーチェックを入れ再び同スクリプトを稼働し
原因特定のため全変数を.txtでdumpしながら走らせて3時間程になりますが
今のところエラーは出現していません
0356デフォルトの名無しさん2016/06/17(金) 19:13:18.67ID:YpnIY8DD
スラドにこんな記事あった

RubyがPythonのようなポジションを得られなかったのはなぜか
http://developers.srad.jp/story/16/06/17/0827240/

最近日本でもPython本急に増えた印象あるよね。
やばいのかなRuby。
0357uy ◆e6.oHu1j.o 2016/06/17(金) 21:55:15.96ID:GkjZw5OC
>>355
ほぼ同じ別のスクリプトで再発し今度はさらに状態の悪いデータになっていたので原因は確定しました
どうバグを回避し表面化させないかというフェイズに移行します
ありがとうございました
本番環境はruby1.9.3なので古いバグを踏んだものと思う事にします
0358デフォルトの名無しさん2016/06/18(土) 15:29:35.92ID:AGMP56Qn
>>356
Pythonに負けた理由なら
1. 実行速度が遅かった
2. Windowsへの対応がひどかった
じゃね
他にもあるかも知れん
0359デフォルトの名無しさん2016/06/18(土) 15:37:16.15ID:Au7MFafK
負けたというか世界的にはRubyってRailsの組み込みスクリプトという認識しかないわけで
そもそも勝負にすらなってない
0360デフォルトの名無しさん2016/06/18(土) 15:59:35.05ID:RKqldoZs
ある意味勝ち逃げだろ Pyrrha は。
ただ、あれで終わり。
みんなの記憶にしか残らない散った存在。

Ruby はまだこれから成長する。
この差は大きい。
0361デフォルトの名無しさん2016/06/18(土) 16:49:47.95ID:SI6NucGb
勝ち負けとか心底どうでもよくね?
長けてる領域が違うだけの話
0362デフォルトの名無しさん2016/06/18(土) 19:27:38.85ID:AGMP56Qn
たしかに負けてるは言い過ぎだったかもしれない
こんなにたくさんレスが付くとは思わなかった
0363 ◆QZaw55cn4c 2016/06/18(土) 19:32:09.34ID:KfEx8M6W
ruby をはじめた
0364デフォルトの名無しさん2016/06/18(土) 20:10:04.10ID:SI6NucGb
>>362
なんかすまん
個人的にdisってるわけじゃないので気にしないでくれ
ちなみに俺はRubyの方が好き
0365デフォルトの名無しさん2016/06/18(土) 21:19:07.41ID:bpHrap68
>>362

Ruby に謝れ
0366デフォルトの名無しさん2016/06/18(土) 21:45:00.52ID:QKdVDmdU
Rubyは、Windows対応で負けている。
GUIに対応させるのは、面倒

一方、黒魔術(メタプログラミング・実装)系の良本が多い

メタプログラミング Ruby 第2版、2015
Effective Ruby、2015
Rubyのしくみ、2014
0367デフォルトの名無しさん2016/06/19(日) 12:37:38.12ID:5KvSKdL/
pythonにも黒魔術はあるが
黒魔術でもpythonの方が書きやすいな
0368デフォルトの名無しさん2016/06/19(日) 16:46:12.80ID:rmVET6vi
Win10 Anniversary Updateで少しはWin環境が良くなるのかな?
0369デフォルトの名無しさん2016/06/20(月) 01:21:45.09ID:HoUv0dJ2
>>365

http://img01.deviantart.net/c0e3/i/2013/346/1/5/rwby_genderbent_by_mechanicale-d6xq7tb.jpg
0370デフォルトの名無しさん2016/06/20(月) 09:01:35.78ID:XE/E5M6R
Ruby初学者です。既に5冊の本にチャレンジしましたがそのことごとくに挫折し、今新たに「Rubyの絵本」という本で
勉強しなおしています。以下のコードで理解できない場所があります。

n cats = [] = 1
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tara"
puts(cats[n])
cats[0] = "Shiro"

2〜4行目は配列catsに4つの要素を代入しているんだろうということはわかります。そして6行目は0番目の要素にShiro
を代入したのでKuroが消えている?のだろうということもわかる気がします。ところが、5行目のputs(cats[n])「は配列0〜3
までの要素をすべて表示する」と私は考えたのですが、本に「はcats[1]の値を表示」となっています。知りたいことは以下の2点です。

1.そもそもn cats = [] = 1とはどういう意味なのか、n cats = []は空配列を作るという意味ではないのか。なぜそのあとに=1と続くのか。
2..puts(cats[n])としか書いてないのになぜ、1番目が入るのか。

基本的なところから理解していなくて申し訳ありません。詳しい方のご教授をお願いします。
0371デフォルトの名無しさん2016/06/20(月) 09:12:09.51ID:Kk80zM3k
>n cats = [] = 1
SyntaxError: unexpected '=', expecting end-of-input
n cats = [] = 1

5冊読む前に1冊でも理解した方が良いよ
0372デフォルトの名無しさん2016/06/20(月) 09:24:31.93ID:XE/E5M6R
>>371
ありがとうございます。そうですよね、エラーが出るんです。おかしいな、間違って書いてないとおもうのですが。
あとはあなたのおっしゃる通りなのですが、プログラム自体が初めてでなるべく簡単そうな本を探して自学しています。
でおどの本も途中から猛烈に難しくなって「こりゃ駄目だ」と思ったら次の本という繰り返しで弱っています。
0373デフォルトの名無しさん2016/06/20(月) 09:25:44.54ID:Kk80zM3k
ちなみに
n cats = [] = 1
はまず [] = 1 ってのが実行されようとするからその時に構文エラーになる

n, cats = 1, []
の見間違いじゃない?
0374デフォルトの名無しさん2016/06/20(月) 09:40:16.81ID:Kk80zM3k
誤植か見間違いから知らないけど
n cats = [] = 1 は結局は
n = 1
cats = []
としたかったんだろう

この前提の下なら370の言っていることは概ね正しい
そして n = 1 なので
puts(cats[n]) は
puts(cats[1]) ってことで1番目の要素が出力されることになる
0375デフォルトの名無しさん2016/06/20(月) 09:43:21.95ID:XE/E5M6R
>>373
おお、すごい。ありがとうございます。ちゃんとTamaが表示されました。うれしい。
今、改めて本を読みなおしてみたんですが、やっぱりn cats = [] = 1となっていました。
自分のようなど素人がこれをやられるとどうにもなりません。どこがわからないのかわからない
というのは情けない限りですが、おかげさまで納得して先に進むことができました。ありがとうございました。
0376デフォルトの名無しさん2016/06/20(月) 09:45:26.19ID:XE/E5M6R
>>374
おお、わかりやすい説明ありがとうございます。助かりました。
0377デフォルトの名無しさん2016/06/20(月) 09:51:56.08ID:Tc3CU3LQ
出版社のサイトに正誤表あったよ
0378デフォルトの名無しさん2016/06/20(月) 10:29:34.75ID:OWUJ8xtd
そんなにRubyが合わないなら早めにPythonに乗り換えた方がいいな
せっかくこれから新しいのを覚えるというチャンスなのに10年後廃れている
言語を学ぶのはもったいない
0379デフォルトの名無しさん2016/06/20(月) 11:06:36.37ID:XE/E5M6R
>>377
そうですね、何で最初から出版社のホームページを見なかったんだろう…

>>378
いや、実はRubyが学びたいのではなくて人工無能を作成して将来、人工知能の勉強へとつなげられればと思って勉強しています。
そもそもなんでRubyなのかというと、10年ほど前に「恋するプログラムRubyでつくる人工無能」という本を購入しまして、
最初は「おお、面白い」と呼んでいたのですが、その内、配列?ハッシュ?インスタンス変数?とつぎつぎにわけのわからない
言葉がでてきました。これはもう本格的にRubyってやつを勉強しないとどうにも読めないなと考えて一念発起して、Rubyの解説書を
買いまくりました。ところがこれがさっぱり何を言ってるのかわからない…。なんせ、プログラムと言えば大学の時にちょろっとベーシックを
かじった程度でそのまま放置でしたから。

とりあえず、3冊買って読みましたが、「これは自分には無理だ」とあきらめ、数年が過ぎたのです。ところが幸か不幸か、今年は自由な時間が
取れまして(理由は深くは突っ込まないでください)、ふと本棚を見ると、ああこんなの買ったなあと思い出しました。よし、せっかくの機会だ。
なんとかがんばってRubyってやつをマスターしてやろうと今に至った次第です。とにかく、なんとしても「恋するプログラムRubyでつくる人工無能」
という本が理解できるようになりたいです!

長々とすみませんでした。
0380デフォルトの名無しさん2016/06/20(月) 12:33:22.39ID:6a0VacLi
3行で
0381デフォルトの名無しさん2016/06/20(月) 15:04:19.05ID:zSeivZg9
>>366
> Rubyは、Windows対応で負けている。
> GUIに対応させるのは、面倒

気になったので試してみました
mswin版は1.8で少し調べてオワコンっぽい感じがしたので
動作確認したものはx86-mingw版のみで以下の組み合わせ

[2.3] fxruby gtk2 gtk3
[2.2] fxruby qtbindings-4.8.6.1 gtk2 gtk3
[2.1] fxruby qtbindings-4.8.6.1 gtk2-3.0.7 gtk3-3.0.7
[2.0] fxruby qtbindings-4.8.6.1 gtk2-3.0.7 gtk3-3.0.7
[1.9] fxruby qtbindings-4.8.3.0 gtk2-2.2.0 gtk3-2.2.0 wxruby-ruby19
[1.8] fxruby qtbindings-4.8.3.0 gtk2-1.2.1 wxruby

fxruby : まったく問題なし。
wx : 2系で使えないのが残念。
qt : QtSDKが300MB超とデカイのが気になるところ。
gtk : 依存パッケージのバージョン解決が甘いので
(gtk3自体はruby1.8に対応しているが依存パッケージがruby>=1.9を求めるので不可だったり
依存パッケージのバージョン上限が設定なされていない為
--ignore-dependencies, gem sp xxxなどしながら個別に入れる必要があった)
古いバージョンを使う時には少々手間がかるのがネック。

自分の場合は慣れたqtかgtkかの二択だけど
fxrubyが http://rubyinstaller.org/downloads/ にも明記されてるぐらいなので無難だと思う。
0382デフォルトの名無しさん2016/06/20(月) 16:37:55.79ID:RVn5oxXA
>>379
その本読んだけど
無脳本は目標として良いと思うよ

人工知能は最先端だから超難しいけど
人工無脳は基本が分かれば難しくない

マルコフ連鎖だけちょっと
何やってるか分かりにくいけど
ハッシュでしりとりみたいなこと
させる仕組みは単純で感心する

コードを読んで動作をイメージ
できるようになれば分かる
0383デフォルトの名無しさん2016/06/20(月) 16:41:50.02ID:RVn5oxXA
あとは本って出版された後は古くなる一方だから
GUIキットは本の(Visualu Ruby)にこだわらず
今の新しいライブラリ使った方が便利
0384デフォルトの名無しさん2016/06/20(月) 16:47:39.38ID:78XmmaUt
>>377
もしこれが本当なら
かなり恥ずかしい部類の
誤植だな
0385デフォルトの名無しさん2016/06/21(火) 12:37:52.56ID:na89rYIQ
一行で短くまとめられる仕様もここまで極まったか…と一瞬戦慄したわ
0386デフォルトの名無しさん2016/06/21(火) 13:24:02.94ID:LE9F52CG
編集者なにやってんだよ
首吊ってくるレベル
0387デフォルトの名無しさん2016/06/21(火) 17:03:07.87ID:W3C4RKeO
>>382
ありがとうございます。まあ、他の言語を試せばいいのでしょうけど、こうやってわからなかったら次の言語とやってると、同じことがあった時にまた引越しなきゃならなくなる
のでがんばってRubyをマスターすることにします。

さて、「Rubyの絵本」のループの中断まで勉強が進みましたが、以下のコードの違いがよくわかりません。どなたかご教授よろしくお願いします。#の部分は自分が理解しやすいように
かってにコメント文章をつけたものです。よろしく願します。

a = 0
while a < 5
if a == 2
a = 10
next
end
print(a, "")
a += 1
end

aの値がwhile文の条件に合致している間はループ。
(1回目ループ)aに0が入っているが、if文が成立しないのでnextの下へ行き、a0と表示されてaが1になり、2回目のループに入る。
(2回目ループ)aに1が入っているが、if文が成立しないのでnextの下へ行き、a1と表示されてaが2になり、3回目のループに入る。
(3回目ループ)aに2が入っているが、if文が成立するのでaの値が10になるが、nextが発動し今の処理はなかったものとされ、aの値は2のまま?

似たようなプログラムがredoでもあるのですが、そちらはまあなんとか理解できます。問題はnextのほうで、今一つ理解できません。a=2のままなら無限ループするんじゃないかと自分では思ったのですが、
実際の出力結果は
a0
a1
となっているので、何か勘違いをしているのだと思いますがそれがなんなのかわかりません。長文申し訳ありませんがよろしくお願いします。
0388デフォルトの名無しさん2016/06/21(火) 17:27:16.66ID:rdnhr1yO
a == 1 の時、
1 と出力してから a += 1 によって a == 2 になって2行目へ行く。
次のループでは a == 2 なので a == 10 になってまた2行目へ行く。
a < 5 は false なので while〜end は実行されずに終了する。
0389デフォルトの名無しさん2016/06/21(火) 17:28:05.78ID:397g3bwN
>>387
言語の引っ越しはしないで正解

C++、Javaとか他のメジャーな言語は
だいたいRubyより難しいよ
実行速度を速くしたいときとかに使う

コードの方は
nextについて「勘違いをしている」

nextの後whileの条件節で
偽になるから無限ループしない
0390デフォルトの名無しさん2016/06/21(火) 17:29:54.69ID:LE9F52CG
そもそもなんで a=10 を代入してるんだろ a=5 じゃだめなんすか?
0391デフォルトの名無しさん2016/06/21(火) 17:36:43.51ID:397g3bwN
>>390
5でもいいよ

>nextが発動し今の処理はなかったものとされ
これが勘違いね
0392デフォルトの名無しさん2016/06/21(火) 17:39:26.71ID:rdnhr1yO
まあそれを言い出したら print(a, "") とかも謎だよね
元は print(a, "\n") だったのかな
0393デフォルトの名無しさん2016/06/21(火) 18:01:59.82ID:MNNlgPEV
break を教えずに a=Hoge とか +=1 以外の方法で制御変数書き換える形で脱出って筋悪いよね
0394デフォルトの名無しさん2016/06/21(火) 18:09:39.05ID:mjvOmEo6
普通にバグの元になるな
0395デフォルトの名無しさん2016/06/21(火) 18:10:26.89ID:W3C4RKeO
>>388
そっか、なるほど!条件文がfalseになってるからwhile文のendまですっ飛ばされるわけですね!
すっごくよくわかりました。ありがとうございます。「a=10がなかったことになる」のではなくて、
a=10のままwhile文の条件文を吟味するんですね。やっとわかりました。

それから今頃なんだと怒られるかもしれませんが、今一度本を読み返してみたら、nextとredoで
戻る場所が違ってたんですね。めんぼくない。redoだと条件文にジャンプしないからa=10のまま出力される
というわけですね。なんでもいいけど、難しいなあ。皆さんよくこんな複雑なものをマスターできましたね。
自分の頭が悪いのかな。まあ、とにかくがんばります!そのほかの皆さんの回答もありがとうございました。
0396デフォルトの名無しさん2016/06/21(火) 19:01:29.78ID:VP/Q8JMz
というかRubyでその手のループはtimesとかuptoとか使うべきだし、改行を伴う標準出力はputsを使うべきだと思う
元の本を知らんからアレだが…

あとRubyは簡単ではないと思う
それなりのことをサクッとやるのは簡単だけど
0397デフォルトの名無しさん2016/06/21(火) 19:08:43.11ID:rdnhr1yO
whileやforなんてなるほどあんまり使わないけど制御構造は一通り学んでおくべきなんじゃないのかな
まあ俺ならこう書くが
5.times{|i|
  break if i == 2
  puts i
}
0398デフォルトの名無しさん2016/06/21(火) 19:21:50.55ID:gJMymMte
俺ならこう書く
5.times{|_|-~p(_)!=2||break}
0399デフォルトの名無しさん2016/06/21(火) 19:48:13.62ID:mn7QpJSf
初心者向きじゃない書き方止めて!
わけワカメ
0400デフォルトの名無しさん2016/06/21(火) 20:30:33.33ID:gJMymMte
じゃあ
p *(0..5).first(2)
0401デフォルトの名無しさん2016/06/22(水) 06:25:24.35ID:jdKVcriH
module A
def a
p 'A'
end
end

module B
def b; a; end
def a
p 'B'
end
end

class X
include B
include A
end

p X.ancestors #=> [X, A, B, Object...]
p X.new.b

"A"
"A"
なぜ、2回もAが表示されたの? Bが表示されない

モジュールB内で、aを呼んだときは、静的スコープのB.a を読んでくれないな。
常に動的に、X, A, B の順に、aを探すのか
「メタプログラミング Ruby」1.6章より
04024012016/06/22(水) 06:34:16.68ID:jdKVcriH
B.a を呼んだときは、メソッド探索順に影響されず、
静的スコープのB.a を呼ぶ方法はないの?

動的言語だから、無理なのか?
0403デフォルトの名無しさん2016/06/22(水) 08:04:36.14ID:AQa0dSs+
>>401
ひっかけ問題かな。p の数を数えてみろ。
0404デフォルトの名無しさん2016/06/22(水) 08:07:48.65ID:AQa0dSs+
>>402
C++ みたいなクラス名修飾は無いね。別の名前を付けるしか
0405デフォルトの名無しさん2016/06/22(水) 11:45:54.25ID:yBOVYSwe
>>399
その考え方は良くない
0406デフォルトの名無しさん2016/06/22(水) 12:30:51.61ID:3DCeoZi+
ruby向きじゃない書き方やめて!
わけワカメ
0407デフォルトの名無しさん2016/06/22(水) 17:17:51.11ID:7oRMeHhG
foo bar, baz do 0 end
foo bar, baz { 0 }
これって動作違うのな、テスト書いてたらエラー出てびっくりしたわ
0408デフォルトの名無しさん2016/06/22(水) 18:15:16.93ID:gUQq/XMB
トリッキーな書き方する方が
考え方として良くない
短くなっても保守しにくくなる
04094012016/06/22(水) 20:22:56.84ID:jdKVcriH
>>401
自己レス

>p X.new.b
ここにも、p を付けていたから、2回表示された

>>407
意味わからん。カッコで囲んで
0410デフォルトの名無しさん2016/06/22(水) 20:31:09.09ID:1DvIaRNW
>>401
>モジュールB内で、aを呼んだときは、静的スコープのB.a を読んでくれないな。
>常に動的に、X, A, B の順に、aを探すのか

p X.ancestors #=> [X, A, B, Object...]

この結果を見れば明らかで、B, A の順序で include したのだから
Rubyの仕様に従った振る舞いな訳だけど、何が問題なの?

リファレンスを熟読してRubyの仕様を理解したほうがいいと思うよ
基礎ができていないのにメタプログラミングに手を出すのが挫折の原因だ

>>402
> 静的スコープのB.a を呼ぶ方法はないの?

ないよ
やるならクラス X の定義において、 include の順序を逆にする

> 動的言語だから、無理なのか?

いや、動的言語のRubyでも(モジュールやクラスを含む)定数の宣言は静的だよ
【ここで静的とは、一度宣言した値を後から(破壊的に)更新できないことを意味する】
できない理由は、上で書いたように「Ruby の仕様」だから

そのRubyの仕様に不満があるなら、多重継承とその問題点、および Mix-in が考案された
背景を勉強してから、Rubyコアへ次期Rubyの仕様変更案として提案すればいい
0411デフォルトの名無しさん2016/06/22(水) 21:15:23.44ID:os3fAdit
>>410
いやあるだろ
普通は使わんやり方だけど
0412デフォルトの名無しさん2016/06/22(水) 21:15:23.89ID:V2EBWOtT
>>407
http://rurema.clear-code.com/2.3.0/doc/spec=2fcall.html
リファレンスにがっつり書いてる
0413デフォルトの名無しさん2016/06/22(水) 21:16:15.70ID:k2RSEIyn
rubyを勉強してるだけで、文句を言ってるわけじゃないだろうに
0414デフォルトの名無しさん2016/06/22(水) 21:19:37.78ID:49vA2Qsp
リファレンスをおおかた読んで大体のやりたいことはできることになったんだけど
いまだにProcを使うツボがよくわからん
メソッドを新たに定義するのではダメなの?
0415デフォルトの名無しさん2016/06/22(水) 22:18:19.16ID:Q+XBk88Y
ProcはRubyの実装に内部的に使われているだけ
本来人間が直接触るもんじゃないので気にしなくていい
Rubyはメタプログラミングだのと抜かして中身を弄り回そうとする馬鹿が多いが、
あんなのはバッドノウハウであってカッコイイことでも何でもない
0416デフォルトの名無しさん2016/06/22(水) 22:40:21.74ID:V2EBWOtT
>>414
メソッドはクラスに属してなきゃいけないけど、それだとめんどくさいときとかに使える
04174012016/06/22(水) 22:45:04.32ID:jdKVcriH
module B
def b; a; end
def a
p 'B'
end
end

静的言語では、bを呼んだら、同じモジュール内の、aを呼ぶのが自然。
モジュールBのbを呼んで、次にaを呼ぶ際、異なるモジュールのaを呼ぶとは普通、思わないだろw

モジュールBを書いている奴は、当然同じモジュール内の、b・aを想定している

これぐらい静的スコープから、解決してほしい
0418デフォルトの名無しさん2016/06/22(水) 22:51:38.89ID:1DvIaRNW
>>414
すぐに思いつくのは2つのケース

1. メソッドへ複数のブロックを渡したい時
2. メソッド定義するまでもない短い処理を定義したい時

1. は自明だと思うから省略するとして、2. の例:

複数のイベントに応じてアクションを実行したい時、
  Actions = {
    :eventA => Proc.new {|x| …. },
    :eventB => Proc.new {|x| …. },
      :
  }
とHashでテーブル化しておいて、
  Actions[event].call(x)
と呼び出す

アクションの中身が複雑で長いコードならば可読性のある命名で
メソッドを定義すべきだろうけど、たとえば変数に代入するだけとか
単にライブラリ関数を呼ぶだけなんてケースでメソッド定義は面倒だよね
そんな時にはProcを使って、明示的にブロックオブジェクト(=クロージャ)を生成する
(ただし、個人的には Proc.new ではなく lambda といふ記述を好むけどね)
0419デフォルトの名無しさん2016/06/22(水) 22:54:00.17ID:jdKVcriH
>>414-416
proc, lambda, block(&) は、コード・処理を持ち運んで、後で、call で実行できる。
blockは、yield で、callback してもらえる

以下は、即時実行っていうこと?

proc{〜}.call
lambda{〜}.call
0420デフォルトの名無しさん2016/06/22(水) 23:09:35.89ID:1DvIaRNW
>>417
だから静的言語とか静的スコープとかは関係ないよ

Mix-in とは無関係で、ただ単にモジュール関数を呼びたいのなら、
以下のように書きなさい

module B
  module_function

  def b
    a
  end

  def a
    p 'B'
  end
end

詳しくは「Ruby モジュール関数」でググりなさい

>>410を繰り返すけど、リファレンスから module_function を見つけられない
君のレベルでメタプログラミングに手を出すのは子供じみた無茶な背伸びだよ
それよりもっと基本的なRubyのプログラミング技法を学んでからにしなさい
0421デフォルトの名無しさん2016/06/22(水) 23:40:23.32ID:V2EBWOtT
>>417
あくまで主役はXなんだから、Xから見て早く見つかる方を選ぶのは当然の話

静的言語の Scala にも Module と似たような trait があるが、結果は Ruby と変わらない


trait C {
 def a: String
}

trait A extends C {
 override def a = "a"
}

trait B extends C {
 def b = a
 override def a = "b"
}

class X extends A with B
class Y extends B with A

(new X).b // => "b"
(new Y).b // => "a"
0422デフォルトの名無しさん2016/06/22(水) 23:42:12.64ID:gUQq/XMB
>>414
コールバックに使う
0423デフォルトの名無しさん2016/06/23(木) 08:10:59.54ID:LmS7lhU+
>>414
無名関数の代わりに使う
0424デフォルトの名無しさん2016/06/23(木) 21:24:51.44ID:O+dpjAUR
ちょっと質問なんですが、1:1:多のデータベースあって最初の1のデータベースには管理者が登録するデータ、真ん中の1のデータベースにはユーザーが変更するデータ、最後は商品のデータベースという感じで設計してるんですがhas many throughで良いんでしょうか?

それともいっそ、管理者が登録するデータベースとユーザーが変更するデータベースを同じにしてアクセス権限で表示するビューを切り分けた方が良いでしょうか?

アドバイスよろしくお願いします。
0425デフォルトの名無しさん2016/06/23(木) 21:54:12.06ID:M8iyAzNM
has many through は多対多用
0426デフォルトの名無しさん2016/06/23(木) 23:16:42.11ID:O+dpjAUR
>>425
どの本読んでもそう書いてあったんですがこの場合で使えないということはないですよね?
0427デフォルトの名無しさん2016/06/24(金) 00:39:46.72ID:gxtxbzXV
rubyとかphpのwebフレームワークのインストールが難しすぎる、、、

いつも失敗する
0428デフォルトの名無しさん2016/06/24(金) 08:17:33.76ID:xEd+6tYG
多:多って、A.key * B.key が、5 * 10 など、組み合わせが積になるもの

その際、中間にテーブルを作って、双方のキーを入れる
A, (A.key, B.key), B
0429デフォルトの名無しさん2016/06/24(金) 10:12:39.00ID:F8DC/AtK
>>414だけど解答どうもありがとうございました!
0430デフォルトの名無しさん2016/06/24(金) 10:13:24.55ID:AFfOfH8V
>>424
そもそも設計が良くない気がするんだが
0431デフォルトの名無しさん2016/06/24(金) 11:00:41.58ID:Ua7mp3z0
>>425

テーブル統一して1対多でいくことにしました。
04324012016/06/25(土) 16:08:58.21ID:4ZuZDTqb
>>401
module A
class AA
def a; p 'A'; end
end; end

module B
class BB
def b; a; end
def a; p 'B'; end
end; end

class X
include B; include A
BB.new.b
end

p X.ancestors #=> [X, A, B, Object...]
X.new #=> "B"

a()をクラス内に入れたら、メソッド探索順では、Aモジュールの方が先なのに、
A::AA.a ではなく、B::BB.a が呼ばれるようになった

b()・a()が同じクラス内なら、呼び出し順は、モジュール探索順よりも、クラス内が優先される
0433デフォルトの名無しさん2016/06/25(土) 17:51:57.20ID:4KOaD2nt
A::AA B::BB は継承関係にないから当然だろ
A をインクルードしても A::AA のメソッド探しに行ったりしないよ
0434uy ◆e6.oHu1j.o 2016/06/27(月) 12:10:54.85ID:fzKuFJZp
gmkzRubyのバグ報告です


hostsを以下のように書き替え( 広告NG用
http://notepad.cc/share/R0lOXB8Zzs

以下のようなプロキシーサーバーをたてて繋いでブラウジングをしていたところ
https://ideone.com/JN6VDO

rubyが実行を停止しました
http://i.imgur.com/4gxFT71.png


OS:Win10
ブラウザ:Firefox
administrator:uy
0435uy ◆e6.oHu1j.o 2016/06/27(月) 12:12:44.87ID:fzKuFJZp
>>427
RailsInstaller使ったか?

gem install railsで普通にインストールが成功する可能性は、
ゼロではないけど、もはや幻想
0436uy ◆e6.oHu1j.o 2016/06/30(木) 08:28:51.01ID:U+B64GZ8
>>401
https://ideone.com/9nWuIF

rubyのこの辺のスコープは不満ある
直される事はないだろうけど


rubyでしかやらないようなコードに分かりやすいルール作るのが難しいから
結局避けて書いていく
積極的には使われない癖に無駄に複雑な仕様だけが
class、module、include、extend 周りに拡がる
0437uy ◆e6.oHu1j.o 2016/06/30(木) 08:40:38.48ID:U+B64GZ8
>>436
補足:

積極的には使われないといったのは、
この辺のklassを、上下に変数が行き来して、
それを理解しながら書くようなコードの事
include extend が飛び交う場所のメソッド・変数には闇が拡がる

この闇を扱う知識はしかも、他言語では使いようもないruby特有に複雑になってる闇の知識だから
わけのわからなくなってるスコープを制御しようとするのは無駄
0438デフォルトの名無しさん2016/06/30(木) 09:06:35.89ID:bMW7pQBg
そもそもモジュールのメソッド名は
衝突しないように付けること
0439デフォルトの名無しさん2016/06/30(木) 09:26:09.93ID:+cgjiVYz
refineとかusingって全く見かけないなあ
http://docs.ruby-lang.org/ja/2.3.0/method/main/s/using.html
0440デフォルトの名無しさん2016/06/30(木) 20:56:11.15ID:prI+ToNW
>439
んなこたーない。使っている人は使っている。
ただ、ruby2.1以上しか動かない縛りがあるので、古い環境でも動くようにみんな配慮してしまっているだけ。

個人的にはアスタリスク2回でハッシュを受け取る

def foo(a:, **b); p a, b end
foo({a: 1, b: 2})
結果
# 1
# {:b=>2}

とかの方がよっぽど見かけたことないです。
どなたか使ったことある方いらっしゃいますか?
0441デフォルトの名無しさん2016/06/30(木) 21:26:27.67ID:0Yz92fUm
refine多用はしないけど普通に使ってるわ
0442uy ◆e6.oHu1j.o 2016/06/30(木) 21:49:00.82ID:dzWCBRc4
個人的には&.を使える箇所が結構あるからこの実装は嬉しかった
0443デフォルトの名無しさん2016/07/01(金) 00:48:35.08ID:ECjG4IrI
ネットをみていたら知ったのですが
> new A().view();
これがなぜ通るのですか

class A
{
public void view()
{
Console.WriteLine(
■ このスレッドは過去ログ倉庫に格納されています