Ruby 初心者スレッド Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/07/29(日) 14:26:28.92質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ
前スレ
Ruby 初心者スレッド Part 49
http://toro.2ch.net/test/read.cgi/tech/1336507487/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/
0002デフォルトの名無しさん
2012/07/30(月) 00:31:10.11http://kohada.2ch.net/test/read.cgi/php/1341589839/
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://toro.2ch.net/test/read.cgi/tech/1155031689/
書籍:ほぼ公式
「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」 (プログラミング自体が初めてでない人向け)
http://www.amazon.co.jp/dp/4797357401/
「初めてのRuby」 (同上)
http://www.amazon.co.jp/dp/4873113679/
書籍:紙のマニュアルに相当
「Rubyレシピブック 第3版 303の技」(脱初心者向け基礎テクニック集、1.9対応)
http://www.amazon.co.jp/dp/4797359986/
「プログラミングRuby 第2版 言語編」(初心者向け参考書)
http://www.amazon.co.jp/dp/4274066428/
現在、1.8 系列の最新である Ruby 1.8.7 と 1.9 系列の最新である Ruby 1.9.3 の2系統が存在。
肝心な部分がわりと違い、プログラムはそのままでは動作せず、予備知識も別個。
1.8 用のスクリプトやライブラリは 1.9.3 では動作しないので注意。
1.9.3 用の教科書があるなら 1.9.3 から始めても構わない。
Windows用Rubyは、Ruby以外のものもあらかた入っているActiveScriptRubyと
http://www.artonx.org/data/asr/
RubyだけインストールされるRubyInstallerの2種類存在。
http://rubyinstaller.org/downloads/
Rubyリファレンスマニュアル chm版リミックス
http://ruby.morphball.net/refm-remix.html
0003デフォルトの名無しさん
2012/07/30(月) 00:32:31.62・エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ
・いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない
Q.XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか?
A.好きにしろ
※RubyやRuby使いに対する不満や愚痴などは本スレやバトロワスレなどをご利用下さい
0004uy
2012/07/30(月) 05:26:01.45$a = 6
puts "#{$a}" # => 6
puts "#$a" # => 6
$n = Struct.new(:x).new(4)
puts "#{$n.x}" # => 4
puts "#$n.x" # => #<struct x=4>.x
# ↑はぁー?
0005デフォルトの名無しさん
2012/07/30(月) 15:05:07.22ハードウェアを考慮していない。
実は30年前のCと今のrubyでは今の方のrubyの方が早い。
0006デフォルトの名無しさん
2012/07/30(月) 19:39:24.360007デフォルトの名無しさん
2012/07/30(月) 19:40:42.790008デフォルトの名無しさん
2012/07/30(月) 20:01:00.74irb> [1,2,3].grep(1)
=> [1]
irb> %w[1 2 3].grep(/1/)
=> ["1"]
オイェァ
ただし、あんまし使い出がないメソッドであることは否定しない
中途半端に使うと肝心なとこで裏切られるので(自業自得だが)、ふつうにfindとか使うのおすすめ
0009デフォルトの名無しさん
2012/07/30(月) 20:03:35.50> はたらきたくないでござる
うっせーバカ
0010デフォルトの名無しさん
2012/07/30(月) 20:10:54.89せめてどうググればサンプルなどが出てくるか教えていただけませんか?
回数指定をする繰り返しでもなく、このような例が見つからずに途方に暮れています
0011デフォルトの名無しさん
2012/07/30(月) 20:11:57.07単純な<a>リンクのクリックでは動作しないかもしれない
サイトが固定なのなら、本文ページのURLを自力で作成するのが妥当
全部で何ページあるのかとかはそりゃ自分でHtML読んで調べろ
もし単純な<a>リンクであることがわかってるのなら、そりゃその続きを読むリンクがそのページにまだあるかどうかで最終ページの判定すればいいんじゃないの
次のページがないのに次のページのリンクが有効であることはまずない
0012デフォルトの名無しさん
2012/07/30(月) 20:13:58.04Rubyの基礎がまったくできていないために、なにもできない状態になっている
ライブラリを使うことは一旦諦めて、Rubyの基礎の勉強をするといい
0013デフォルトの名無しさん
2012/07/30(月) 20:47:59.36よくわかりました!ありがとうございます!
0014デフォルトの名無しさん
2012/07/30(月) 20:55:31.07初心者をなんかどうにかして助けてくれるような機能があることはないよ
0015デフォルトの名無しさん
2012/07/31(火) 15:14:22.36【五輪】 開会式、各国のなかで日本選手団だけが"謎の退場誘導"…猪瀬東京都副知事も関心寄せる
http://2ch-ranking.net/cache.php?thread=uni.2ch.net/newsplus/1343712277/&res=100
0016デフォルトの名無しさん
2012/07/31(火) 23:04:52.75おもしろくないすねー
0017デフォルトの名無しさん
2012/08/01(水) 11:19:31.20要望を適切に「分解」するのは人力で、それをやるために必要なのは基礎知識と経験だからねえ
今回で言うと「特定の語句があるまでURLの先を取得することを繰り返して本文を溜め込んで返すメソッド」みたいなものを求められても困る
…あっても面白そうな気はするが、デフォルトではたぶん年に1回くらいしか使えなさそうだ(自力で実装したほうが早い)
0018デフォルトの名無しさん
2012/08/02(木) 01:13:38.04モジュール内からトップレベルの定数が参照出来るのってなんでだっけ
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fvariables.html#prio
・トップレベルの定数定義はネストの外側とはみなされない
・モジュールだからancestorsにObjectが含まれるわけでもない
0019デフォルトの名無しさん
2012/08/02(木) 02:18:49.44・ トップレベルに定義されたメソッドと定数は Object に所属することになっている(これはとりあえずそういうものだと理解する)
・ が、モジュール M に対する M.ancestors は [M] だけを返し、Object が含まれていないので Object が見えないはずでは?
てきとーな回答
irb> module M; end
irb> p M.class
Module
irb> p M.class.superclass
Object
superclass の定数がインスタンス内から読めるのは当たり前
…という説明で納得して頂けますでしょうか
たぶんもっとわかりやすくて本質的な説明をしてくれる勇者様がきっと
irb> class SUPERCLASS; end
irb> class CLASS < SUPERCLASS; end
irb> o = CLASS.new
irb> SUPERCLASS.const_set(:CONST,"superclass!")
irb> p o.class
CLASS
irb> p o.class.superclass
SUPERCLASS
irb> class << o; p CONST; end
"superclass!"
0020デフォルトの名無しさん
2012/08/02(木) 02:22:36.55ありがと
0021デフォルトの名無しさん
2012/08/02(木) 02:26:19.13Moduleのインスタンスだってことを見落としてた
class Module < Object
def foo
# ここからObjectの定数が見える
end
end
0022デフォルトの名無しさん
2012/08/02(木) 02:30:21.51そっすなー
マジカルさ加減で言うとトップレベルがObjectに行くほうがマジカルなんだけど、そこはとりあえずスレ的には丸覚えで
0023デフォルトの名無しさん
2012/08/02(木) 05:54:50.91X = 0
def foo
X
end
end
module M; end
M.foo #=> 0
module M; X; end #=> NameError
あれ?
0024デフォルトの名無しさん
2012/08/02(木) 10:49:51.035番目 (Object)
class ×; end
class 3番目 < ×
class 2番目 < ×
class C < 4番目
include 1番目
p CONST
end
end
end
まずinclude/extendを探し、次にスクリプト上のネストを探し、さらに継承元を探し、最後にObjectクラスを探してCONSTがなかったらエラー
class A1; CONST="A!"
class B1; CONST="B!"
class C1; CONST="C!"; end
class C < C1; p CONST; end
end; end #=> "B!"
class A2; CONST="A!"
class B2;
class C2; CONST="C!"; end
class C < C2; p CONST; end
end; end #=> "A!"
class A3;
class B3;
class C3; CONST="C!"; end
class C < C3; p CONST; end
end; end #=> "C!"
これはそういう順番になるように作ってあるとしか言えない、でいいと思う
0025デフォルトの名無しさん
2012/08/02(木) 11:09:01.56class Module
X=0
end
module M
p self #=> M
# M=Module.new なので、C::CONST や C.new.class::CONST は読めても C.new::CONST が読めない理屈と同様、Module::X はここから読めない
end
class << M
p self #=> #<Class:M>
# Classの継承元には Module が含まれているのでふつうに読めるというか、回答でこれを出した>>19が間違ってるんだな
end
0026デフォルトの名無しさん
2012/08/02(木) 12:04:38.92「例外的にそうなってます」でいいのか、それとも
「○○の範囲が見えて、その中にObjectも含まれています」みたいな説明が可能なのか
今の所こういう感じじゃないかと思ってるんだけど違うかな
module A; end とか class A; end の中では以下の順で探索
1 ネストを外側に向かって。ただしトップレベルは含まない
2 継承元に向かって探索(include したモジュールも継承扱い。つまりM.ancestors)
3 Objectから継承元に向かって探索(Object.ancestors。classの場合は2に含まれる)
>>18のページの記述は3が抜けてる?
0027デフォルトの名無しさん
2012/08/02(木) 12:07:05.39× M.ancestors
○ A.ancestors
0028デフォルトの名無しさん
2012/08/05(日) 00:45:43.21a = gets.chomp
while a != "BYE"
puts "what?"
a = gets.chomp
end
このプログラムをwhat?と聞き返されるたびにBYEと入力して、の繰り返しで三回目にそのループから抜けられるようにするにはどうすればよいでしょうか?
0029デフォルトの名無しさん
2012/08/05(日) 01:27:52.18カウンタをつける。
0030デフォルトの名無しさん
2012/08/05(日) 01:45:13.77そうならまずwhileループをbegin〜end while(ruby版do〜whileの構文)に書き換えてから全体を3.timesで囲むとか
0031デフォルトの名無しさん
2012/08/05(日) 02:27:28.02while n < 3
puts "what?"
a = gets.chomp
n += 1 if a == "BYE"
end
0032デフォルトの名無しさん
2012/08/05(日) 13:16:54.32アドバイスありがとうございます。改善してみました。
3.times{
a=gets.chomp
while a != "BYE"
puts "what?"
a=gets.chomp
end}
ただ、これだとBYEと入力したあとにwhat?と返してくれません。どうしたものでしょうか。
今のままだとBYEと入力しない限りはwhatと返す(BYEと返すとループから抜けてしまう)ようになっているので、
BYEと入力してもwhatと返すようにしたいです。それで三回連続でBYEと入力したときだけループから抜けるようにしたいのですが。
BYEと入力した回数をカウンタで数えるのでしょうか。調べてみてもよく分からなかったので教えていただけるとありがたいです。
0033デフォルトの名無しさん
2012/08/05(日) 13:53:50.19> 三回連続でBYEと入力したときだけループから抜けるようにしたいのですが
連続でないと駄目なの?
だったら>>30は忘れて。これは
BYE
HELLO
BYE
BYE
みたいな入力で抜けることだけを想定して書いてるから
基本的には>>31みたいな感じで、BYE以外が入力されたらカウンタをリセットすればいいんじゃないかな
0034uy
2012/08/05(日) 14:57:37.95loop.each_with_object ["","",""] do | _, c |
puts "what?"
a = gets.chomp
p a
c << a
c.shift
break if c.join == "BYE"*3
end
0035uy
2012/08/05(日) 15:22:44.83loop.each_with_object ["","",""] do | _, c |
↓
[["","",""]].cycle do | c |
0036デフォルトの名無しさん
2012/08/05(日) 18:02:50.690037デフォルトの名無しさん
2012/08/06(月) 00:13:49.90joinしてからの判別だと、BY EBY EBYE みたいな入力でも通ってしまう
0038デフォルトの名無しさん
2012/08/06(月) 00:33:56.67while n < 3
puts "what?"
gets.chomp == "BYE" ? n += 1 : n = 0
end
標準ライブラリだとプロンプトを引数にとるメソッドはないんだっけ?
read_input("what?:") みたいなの
0039デフォルトの名無しさん
2012/08/06(月) 00:48:34.92変化を加えてみました。
puts "Say \'bye\' to that old woman."
n=0
while n<3
a=gets.chomp
n += 1 if a=="BYE"
puts "What? I can\'t hear your voice well."
end
puts "OK."
これだと三回目のBYEを入力したあとにWhat? I can\'t hear your voice well.と表示されてしまいます。
三回目のBYEの後はOKだけ表示されるようにしたいのですが、どうすればよいでしょうか?
0040デフォルトの名無しさん
2012/08/06(月) 04:03:01.22わかんないなら先進むのやめとけ
理解が先
わかんないのにさらに要素増やしてどうする
■ このスレッドは過去ログ倉庫に格納されています