トップページ⇒tech
1001コメント332KB

Ruby 初心者スレッド Part 56©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2014/12/13(土) 09:29:12.93ID:DLY4IovQ
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

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

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0508デフォルトの名無しさん2015/01/28(水) 00:50:00.54ID:e5hkyOyG
>>507
なるほどそうですね
ソートしてアクセスする構造をクラスでラップして使うことにします
ありがとうございます
0509デフォルトの名無しさん2015/01/28(水) 06:54:30.56ID:PxKHvaRd
>>503
返信遅れましたありがとうございます
代入って単純に引数与えるだけじゃないんですね
配列も"n"と同じようにリテラルぶっ込んでるだけだと思ってたのに複雑だ・・・
05104062015/01/28(水) 09:32:53.14ID:g/K+Ovy5
a=b=c=d=3
Rubyでは、このようにいくら代入しても、コピーが作られず、
単に参照(変数のアドレス)がコピーされるだけだから、
同一のオブジェクトを指す

ここで、文字列の連結に、<< を使うと、
すべての変数が変わってしまう。
+ を使えば別のオブジェクトが作られる

ここで、b=10とすれば初めて、
bは別のオブジェクトとして作られる。Cow(Copy on write)

必要に迫られるまで、なるべく
新たなオブジェクトを作らないようになっているのだろう

オブジェクトの内容そのものを変える、
破壊的なメソッドを呼ぶ際は、同一のオブジェクトは、
すべて変更されてしまうので要注意

漏れも、<< で苦しんだ。この辺を見て
>>434 >>444
0511デフォルトの名無しさん2015/01/28(水) 10:15:58.27ID:PxKHvaRd
初心者の自分が言うのもなんですが
質問するときは原因箇所を絞って簡略化したほうがいいですよ
その経過で解決する事もありますし
05124062015/01/28(水) 11:14:40.77ID:g/K+Ovy5
>>444
にも書いたけど、Rubyのさかのぼり代入は怖い
$a=b=c=d=3

ここで、d << 10 とするだけで、すべての変数が310になる。
この参照の連鎖は順次、
関数の引数に渡していっても、断ち切れない

グローバル変数までさかのぼって、変更されてしまう
0513デフォルトの名無しさん2015/01/28(水) 11:46:52.90ID:H7DQugwd
Rubyの言語仕様は洗練されていない
unlessなんて削除するべきだ
pとかよりもっとわかりやすい名前を付けるべきだ
0514デフォルトの名無しさん2015/01/28(水) 11:54:27.66ID:slxhZiXo
御自由にどうぞ
0515デフォルトの名無しさん2015/01/28(水) 11:55:41.74ID:slxhZiXo
コミッター連中を観察していれば分かるが
彼らは多少頭のネジが緩いんで
0516デフォルトの名無しさん2015/01/28(水) 13:03:50.23ID:g/K+Ovy5
Rubyだと、p, pp

Pythonだと、print, pprint
だから面倒くさい
0517デフォルトの名無しさん2015/01/28(水) 13:12:56.41ID:RMHK3Bx6
洗練されたクラスを作ればいいだけなのに
0518デフォルトの名無しさん2015/01/28(水) 20:51:43.59ID:JcHJzKkl
>>512
さかのぼる、と考えるから破綻するんよ。
変数に入ってるのは、あくまで参照。それだけ頭に入れてれば破綻しない。
0519デフォルトの名無しさん2015/01/28(水) 21:00:02.47ID:JcHJzKkl
copy on write なんて考えたこともないよ

基本的にRubyの変数は「何かを指し示しているだけ」であり「中身は無い」
中身のように見えるものは「名もなき場所にある」
代入という操作をしたとき、変数は別の場所を指すように書き換わる
それ以外の操作は、中身に対して行われる

そんだけだよ
さかのぼり代入なんてことは何もしてない
同じ人を指さしてるのに、別人に見えたらおかしい
0520デフォルトの名無しさん2015/01/28(水) 21:10:51.95ID:ncVbnS0H
ちなみに512に書いてある例は間違ってるから勘違いしないようにね
0521デフォルトの名無しさん2015/01/28(水) 21:38:51.40ID:GG6BgqZu
「さかのぼる」のは ruby の挙動ではなくて、勘違いしている人の認識だよ
0522デフォルトの名無しさん2015/01/28(水) 22:01:28.15ID:93RLbcHP
この子なんの言語から来たんだろうね
ちょっと思いつかない
0523デフォルトの名無しさん2015/01/28(水) 22:05:04.76ID:OirFWuRy
シフト演算子未満なのはわかる
0524デフォルトの名無しさん2015/01/28(水) 22:51:58.62ID:wg9ENB6e
kenokabeか?
0525デフォルトの名無しさん2015/01/28(水) 23:15:29.17ID:93RLbcHP
その名前を出すなってぇ
05264062015/01/29(木) 00:25:02.09ID:iQsoLHwe
>>512
訂正
<< は数値同士だと、左ビットシフト演算で、

文字列同士だと、破壊的な文字列連結になる
0527デフォルトの名無しさん2015/01/29(木) 01:33:39.82ID:3hN9k9gR
変数ってのは風船のヒモを握る手みたいなもの
代入はヒモを握ること
それまで別の風船のヒモを握っていたなら手放すことになる
<< は風船そのものに字を書き加えること
0528デフォルトの名無しさん2015/01/29(木) 03:22:32.34ID:4rYhRek3
b = "base"
puts b

a = " added"
puts a

b << a
puts b

(c = "base") << " added"
puts c

# C:\work>ruby base.rb
# base
#  added
# base added
# base added
0529デフォルトの名無しさん2015/01/29(木) 10:07:40.13ID:GmAMxhIR
&lt;&lt;が破壊的かどうかもオブジェクトによるから風船の例えも微妙に正確じゃないな
Integer#&lt;&lt;は破壊的じゃないから
a=b=3;&nbsp;b&lt;&lt;10
とかやってもaもbも3072にはならない
0530デフォルトの名無しさん2015/01/29(木) 10:11:39.06ID:GmAMxhIR
ム板の人間なら文字参照をそのまま認識できると信じている
0531デフォルトの名無しさん2015/01/29(木) 10:30:49.47ID:3kqkMOuX
まとめ

不用意に連鎖代入 a = b = [] を使わない
変数は箱というよりはむしろ名札なり矢印なり風船のヒモを握る手
オブジェクトそのものを書き換える操作に注意

風船の例えは元ネタがあるのか知らないけどいい例えだと思った
誰も風船掴んでなかったらどこかへ飛んで行ってしまうわけだし
0532デフォルトの名無しさん2015/01/29(木) 19:19:40.18ID:IUSSB121
もういいからブログで書いとき
アンタの解釈した情報もうしわけないが不要だわ
0533デフォルトの名無しさん2015/01/29(木) 20:09:54.90ID:OMwCYHUr
お尋ねします。
簡単なGUIもどきを作ろうと試みているのですが
可能なのかアドバイスをお願いします。

クイズのような問題提示→ユーザー回答→rubyからの解答
を作ると仮定します

1.
メモ帳等のファイルを開いて、問題文を提示
コンソール上で選択し、結果をメモ帳などに表示すると仮定した場合
リロードの手段をどうしたらよいのか・・・ 

2.
リロード問題を回避するため
rubyでhtmlを生成し、問題を提示
javascriptでリロードと選択ボタンとフォーム入力を提示
ファイルに回答番号を保存し、rubyが読み込むのを待つ
この場合、ファイルの読み書きをrubyとjavascriptの双方でするため
干渉して不具合にならないのか・・・

そんなことをせずに
鯖を立ててerubyでやれ・・とかナシでお願いします。

cvs形式で保存し、htmlかメモ帳程度の表示でやりたいのです。
身の丈にあった低レベルの覚える事が少ない環境で学んでいこうかなと・・
でもコンソールは目がチカチカするので・・・そちらもナシの方向でw
0534デフォルトの名無しさん2015/01/29(木) 20:14:04.36ID:bcTkTriT
>>533
コンソールの背景色を白、文字色を黒にしたらいいんじゃね?
あと鯖ってのは別にマシン1台用意したりする必要はないからな?
0535デフォルトの名無しさん2015/01/29(木) 20:18:01.12ID:y6zSBPNz
んなこと言わないけど
ruby要らねえじゃん
0536デフォルトの名無しさん2015/01/29(木) 21:07:53.31ID:3kqkMOuX
>>533
> 身の丈に合った低レベルの覚えることが少ない環境
ならまず1をコンソール(ターミナル)上でやるべきで
次に2をHTTPサーバとブラウザでやるべきかと思う。そのほうがずっと簡単

1は loop { 問題読み込み; 回答読み込み; 答え合わせ; 結果表示 }
2は標準添付のWebrickが使える
0537デフォルトの名無しさん2015/01/29(木) 21:09:13.09ID:zGbE6mz9
問題表示→ユーザ入力待ち→正誤判定して結果出力
ってやりたいってこと?
これをわざわざrubyとHTMLとjsを絡めて実現するなんてそれこそ身の丈に合ってない気がする
GUIにしたいなら全部jsでやりなよ
0538デフォルトの名無しさん2015/01/30(金) 02:45:08.71ID:X9ozRA2k
【宗教】モルモン教が同性愛容認へ [転載禁止](c)2ch.net
http://daily.2ch.net/test/read.cgi/newsplus/1422528823/
0539デフォルトの名無しさん2015/01/30(金) 05:32:55.78ID:mjc4GdHj
Webrickを覚えることにします
ありがとうございました
0540デフォルトの名無しさん2015/01/30(金) 07:31:01.31ID:aVk8cNPy
vi,emacs,Eclipse などでは出来ないの?

HTML,CSS,JSを使うのは面倒
0541デフォルトの名無しさん2015/01/30(金) 07:45:37.27ID:x2QQOjZO
俺はeclipseを起動する方が面倒だ
0542デフォルトの名無しさん2015/01/30(金) 10:38:25.34ID:4AGK3OqT
おぅ、やっぱそうか
0543デフォルトの名無しさん2015/01/30(金) 10:54:29.13ID:bwBigbzQ
ブロックに渡された引数を暗黙的に受け取る変数とかってありませんか?
ary.map{$a**2}
みたいに書けないかということです
0544デフォルトの名無しさん2015/01/30(金) 11:07:09.14ID:bYNQdyK7
ary.map{|a| a ** 2 }
0545デフォルトの名無しさん2015/01/30(金) 11:12:34.31ID:Abjby/dC
>>543
聞いたこと無いね
普通のメソッドの引数でもそんな書き方無いから、ブロックもないでしょ
0546デフォルトの名無しさん2015/01/30(金) 11:32:32.70ID:Abjby/dC
普通のメソッドには全くないわけではなかったな
yieldはそれに近いな
05474742015/01/30(金) 11:33:46.02ID:aVk8cNPy
>>499-501
最長マッチ .*
最短マッチ .*?

最初の1か所だけ置換 sub
すべての箇所を置換 gsub

最終的にこれですべての、=begin =end間を削除できますた
print File.read('File1').gsub(/^=begin.*?^=end/m, '')
0548デフォルトの名無しさん2015/01/30(金) 12:15:45.16ID:aVk8cNPy
count = 0

File.read('fileA').scan(/abc/){|matched| count += 1}

ブロック変数を使わず、
abc にマッチした回数だけを知りたい場合、
このブロック変数を省略できますか?
0549デフォルトの名無しさん2015/01/30(金) 12:21:19.07ID:hVjevdcM
File.read('fileA').scan(/abc/).size
p File.read('fileA').scan(/abc/)
で確認してみるといい
05505482015/01/30(金) 15:23:09.41ID:aVk8cNPy
count = 'aabccababca'.scan(/abc/).size
2

p 'aabccababca'.scan(/abc/)
["abc", "abc"]


ありがとう
ところで、Rubyには変数宣言を強制する、
JSの"use strict"のような、厳格モードはありますか?

var a=0;
0551デフォルトの名無しさん2015/01/30(金) 18:57:53.85ID:gb3cROEI
ないよ
0552デフォルトの名無しさん2015/01/30(金) 20:33:27.30ID:dK03mtQo
>>543
何度か提案はされてはいるが、受け入れられてないね
0553デフォルトの名無しさん2015/01/30(金) 20:46:23.90ID:BzgyBeS/
>>550
RubyはJSと違ってグローバル変数には必ず$付けなきゃいけないから、
「ローカル変数のつもりで代入したらグローバル変数だった」というのがまずありえない
だから変数宣言がなくても問題ないんだよ
JSのvarってブロックの中で使ってもスコープはメソッド全体になってしまうクソ仕様だから、
varの有無は「ローカル変数か、より広域な変数か」を指定する以上の意味はないので
Rubyの変数名で上記2つを区別する方式に比べてJSのvarが何ら安全性に勝るということはない
0554デフォルトの名無しさん2015/01/30(金) 21:59:14.01ID:gb3cROEI
いや、それはおかしい
0555デフォルトの名無しさん2015/01/30(金) 22:24:09.78ID:+5BNGDg8
3行目はギャグかなんかか
0556デフォルトの名無しさん2015/01/30(金) 22:59:32.61ID:3CnRTZyK
乾坤一擲
05575502015/01/31(土) 00:57:27.52ID:uC1xfWdZ
>>553
同じスコープ内で、
1, l(エル)、0, O(オー)などの書き間違いで、

別の変数の宣言になってしまうのを防ぎたい
0558デフォルトの名無しさん2015/01/31(土) 02:13:10.51ID:SZVKn3yT
これだね
まあ宣言と定義が未分明なRubyじゃ100年たっても実装されるか微妙だな
0559デフォルトの名無しさん2015/01/31(土) 06:53:11.40ID:s4+AsH4m
Rubyは技術的負債
0560デフォルトの名無しさん2015/01/31(土) 08:06:56.70ID:Ozkgovrm
>>557
それが問題になるほど巨大なメソッドを書くなアホ
0561デフォルトの名無しさん2015/01/31(土) 09:30:07.21ID:SZVKn3yT
アホはおまえ
コードの長さとは関係ないよ
0562デフォルトの名無しさん2015/01/31(土) 10:24:29.01ID:gojz97z4
数字と文字に色付けたら解決じゃないの
0563デフォルトの名無しさん2015/01/31(土) 10:38:26.24ID:Xj+5RYHD
0, O, 1, lの区別つけたいならプログラミング向けのフォント使うのもいい
0564デフォルトの名無しさん2015/01/31(土) 10:48:20.45ID:bF0SVAwC
キーボードの打ち間違いをそんなに深刻にとらえてるやつにとって
プログラミングっていったい何なんやろな

いにしえのタイプライター打つオバちゃんみたいなモンなんやろか
0565デフォルトの名無しさん2015/01/31(土) 10:52:32.73ID:Ozkgovrm
テスト書かない人なんだろ
0566デフォルトの名無しさん2015/01/31(土) 10:54:54.05ID:gojz97z4
100年の難題が5秒で解決したな
0567デフォルトの名無しさん2015/01/31(土) 10:56:21.22ID:SZVKn3yT
変数名のタイプミスに煩わされずにプログラミングに集中したいんだよ
0568デフォルトの名無しさん2015/01/31(土) 11:05:37.44ID:gojz97z4
同一変数に色つけて検索確認すりゃいんじゃないの
0569デフォルトの名無しさん2015/01/31(土) 11:10:29.97ID:gojz97z4
スニペット入れてたら自動で候補が出るから
自分が理解しやすい変数名にして_1 _2 とか付けなきゃいんじゃない

レビューで変なネーミングが気になるなら最後に置換すりゃいいだけだし
0570デフォルトの名無しさん2015/01/31(土) 11:10:40.58ID:SZVKn3yT
いちいち変数全部にそんなことできるわけないだろ
0571デフォルトの名無しさん2015/01/31(土) 11:16:11.00ID:gojz97z4
書捨てで確認しないタイプの人なのね
0572デフォルトの名無しさん2015/01/31(土) 11:16:37.37ID:29y+W13d
メモ帳やEDLINでプログラミングしてるんですか?
それは止めた方がいいと思います
0573デフォルトの名無しさん2015/01/31(土) 11:18:26.81ID:29y+W13d
Vim/Emacs/ATOMその他モダンなエディタで補完活用してるなら
typoなんかリテラル文字列以外では無縁なのです
活用できるものを活用してないだけでセンスゼロなのです
0574デフォルトの名無しさん2015/01/31(土) 11:45:59.15ID:Hs82A+Y6
rubocop使うといいよ
0575デフォルトの名無しさん2015/01/31(土) 12:09:16.42ID:Xj+5RYHD
rubocopって未定義変数へのアクセスとかも検出してくれたっけ?
ruby-lintってのはしてくれる
0576デフォルトの名無しさん2015/01/31(土) 12:54:23.05ID:iD+tawgu
vim、emacsはもともと使ってるor今後仕事で使うでもなければ新たに覚えるものでもないしな
Rubyで気軽に使えて標準で補完ができるIDE的なものがあればいいのに
それがないから厳格モード的なのがあってもいいと思う

技術的に難しい部分ってあるのかな?
Matzがいらないと思ってるだけかな?
0577デフォルトの名無しさん2015/01/31(土) 13:49:00.77ID:gojz97z4
欲しければ作ればいんじゃない
0578デフォルトの名無しさん2015/01/31(土) 13:59:36.70ID:29y+W13d
作れる人はまともな開発環境使ってるから作る必要性を感じてないでしょうね
なんか力点がおかしいんですよ
もしくは制限プレイとでも言うんですかね
0579デフォルトの名無しさん2015/01/31(土) 14:05:24.47ID:gojz97z4
答えはそこにあるんじゃないの
0580デフォルトの名無しさん2015/01/31(土) 16:19:23.10ID:fH2ezq9N
Emacs+Rubocopとかコーディングしながらチェックしてくれるしな
0581デフォルトの名無しさん2015/01/31(土) 17:13:09.77ID:RulzY4Di
せやかて工藤
0582デフォルトの名無しさん2015/01/31(土) 17:18:51.24ID:Hs82A+Y6
>>575
くれないと思う
が、そもそもundefinedはユニットテスト通らないし
0583デフォルトの名無しさん2015/01/31(土) 17:21:16.06ID:fH2ezq9N
>>582
そうだね
未定義変数への参照は通った瞬間にエラーなのでそこを通るテストを書いただけで検知できるね
代入の方はその後その変数は使われないだろうから、rubocopが検知してくれる
0584デフォルトの名無しさん2015/01/31(土) 18:00:35.57ID:Xj+5RYHD
ユニットテスト書く前提ならこんな話にはならなかったんや!

と思うのでいまどきの入門書書く人はそこらへん留意していただけると嬉しいです
0585デフォルトの名無しさん2015/01/31(土) 18:08:45.92ID:L1WBwZOU
ときどきObject#sendが邪魔に感じる。
なぜ__send__だけにしておかなかったのだろう。
0586デフォルトの名無しさん2015/01/31(土) 18:26:49.34ID:Hs82A+Y6
> 邪魔に感じる。
どういった状況で?
0587デフォルトの名無しさん2015/02/01(日) 15:00:59.60ID:cy2W8bd9
puts 文字列 + 数値、数値 + 文字列では、
数値.to_s が必要だが、
一々面倒なので何とかならないか?


global変数は、すべてのファイルで共通になるが、
そのファイル内だけのglobal変数は無いの?

C言語で言うと、extern, staticの区別
0588デフォルトの名無しさん2015/02/01(日) 15:08:13.07ID:3vNkahG1
>>587
#{...} を使えばいいんじゃね?
0589デフォルトの名無しさん2015/02/01(日) 16:50:47.88ID:lQgEbHmF
Cユーザーならsprintf使っとけ。
0590デフォルトの名無しさん2015/02/01(日) 16:56:53.64ID:XkAsCPXm
>>587
新型のputsを自作すればいい
0591デフォルトの名無しさん2015/02/01(日) 17:13:44.38ID:zDAnvj5f
myputs(a, b)

仕様
aが文字列か数値か判別して、数値なら文字列に変換
bが文字列か数値か判別して、数値なら文字列に変換
a + bを標準出力
0592デフォルトの名無しさん2015/02/01(日) 17:48:23.39ID:cgGRoexe
588か589だな
n = 1
puts "#{n} + 1 = #{n+1}"
puts "%d + 1 = %d" % [n,n+1]
0593デフォルトの名無しさん2015/02/01(日) 18:04:22.58ID:CCPA60Z6
$ irb
irb(main):001:0> def my_puts(*xs); puts xs.map { |x| x.to_s }.join; end
=> :my_puts
irb(main):002:0> my_puts "x = ", 123
x = 123
=> nil
irb(main):003:0>
0594デフォルトの名無しさん2015/02/01(日) 19:07:56.22ID:jb7bJiwh
putsのそういう挙動が当たり前と感じるのなら
むしろString.+をいじった方がいいのでは
0595デフォルトの名無しさん2015/02/01(日) 19:11:56.17ID:idWDCOsc
型のゆるい言語は嫌われます
使いたくもないです
0596デフォルトの名無しさん2015/02/01(日) 19:16:31.23ID:esW6O74B
そもそも全く違うオブジェクトを+で連結したいと考えることがおかしい
他の特定の言語では当然だったかもしれないが、その言語ではない言語では当然ではない

no = 596
puts "このレスは#{no}番目です"
0597デフォルトの名無しさん2015/02/01(日) 19:26:10.02ID:ymu35Jul
あらゆる側面で糞面倒なJavaが文字列とオブジェクトの+連結を認めてるのが一番意外
0598デフォルトの名無しさん2015/02/01(日) 19:30:08.08ID:OM+Gcdnk
Javaみたいな静的言語なら加算なのか文字列連結なのかはコードから明らかだからいいんだよ
動的型だと実行してみるまでどっちの意味になるかわからないからまずいわけ
0599デフォルトの名無しさん2015/02/01(日) 20:18:03.21ID:QmWK2eIJ
オブジェクトテスト用にクラス作っとばいんじゃないの
0600デフォルトの名無しさん2015/02/01(日) 20:27:04.35ID:esW6O74B
>>598
組み込み基本のクラスを使う限りどっちの意味にもならない
irb> 1 + "one"
TypeError: String can't be coerced into Fixnum
from (irb):1:in `+'
irb> "one" + 1
TypeError: no implicit conversion of Fixnum into String
from (irb):2:in `+'
自作クラスの自作メソッドの挙動やto_strの乱用にまでは責任を持てない
0601デフォルトの名無しさん2015/02/01(日) 20:57:21.24ID:j8xgKLPZ
>>587
ファイル所属の変数は無いが
モジュール所属の変数はあるので、ファイル毎にモジュール作れば良い
0602デフォルトの名無しさん2015/02/01(日) 22:17:06.17ID:dK11pYT4
おまえらいつまでRubyみたいな技術的負債使ってんの?
0603デフォルトの名無しさん2015/02/01(日) 22:23:41.26ID:lVVBipUT
パチンカスと一緒です。
つぎ込めば、いつか見返りがある儲けられる、と思い込んでいるのです。
絶対に抜けられません。
0604デフォルトの名無しさん2015/02/01(日) 23:17:13.34ID:3vNkahG1
そう思ってるならこんなスレ来なきゃいいだけなのにね
あぁ、「どうせあの葡萄はすっぱいに決まってる」という寓話を地で演じてるのか
0605デフォルトの名無しさん2015/02/02(月) 06:12:00.34ID:hiXwrLan
暇人が釣れるから来るんだろう
0606デフォルトの名無しさん2015/02/02(月) 07:13:04.85ID:r+Lk9y7y
この前の基地外がRuby使うの止めたら止めようかな
0607デフォルトの名無しさん2015/02/02(月) 08:27:04.62ID:2QTFDeMY
rubyが「楽しいと感じないなら辞めれば良い」のです
楽しいと感じないのにタイプしてるのはバカか仕事なのです

呪うべきは楽しくないのに選択した自分か、仕事を押し付ける上司
それが答えなのです
■ このスレッドは過去ログ倉庫に格納されています