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

Ruby 初心者スレッド Part 50

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/07/29(日) 14:26:28.92
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、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.11
【RoR】Ruby on Rails Part15
http://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使いに対する不満や愚痴などは本スレやバトロワスレなどをご利用下さい
0004uy2012/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
Rubyが遅いというのはCと比べてとかの相対的な批判であって、
ハードウェアを考慮していない。

実は30年前のCと今のrubyでは今の方のrubyの方が早い。
0006デフォルトの名無しさん2012/07/30(月) 19:39:24.36
Array#delete_if はあっても Array#grep が無いというのはFAQでしょうか?
0007デフォルトの名無しさん2012/07/30(月) 19:40:42.79
前スレ最後のやつお願いします
0008デフォルトの名無しさん2012/07/30(月) 20:01:00.74
>>6
irb> [1,2,3].grep(1)
=> [1]
irb> %w[1 2 3].grep(/1/)
=> ["1"]
オイェァ
ただし、あんまし使い出がないメソッドであることは否定しない
中途半端に使うと肝心なとこで裏切られるので(自業自得だが)、ふつうにfindとか使うのおすすめ
0009デフォルトの名無しさん2012/07/30(月) 20:03:35.50
>>7
> はたらきたくないでござる
うっせーバカ
0010デフォルトの名無しさん2012/07/30(月) 20:10:54.89
>>9
せめてどうググればサンプルなどが出てくるか教えていただけませんか?
回数指定をする繰り返しでもなく、このような例が見つからずに途方に暮れています
0011デフォルトの名無しさん2012/07/30(月) 20:11:57.07
物凄く一般論としては、現在のread moreとかはJavaScriptやらCSSやらで実装されていることが非常に多い
単純な<a>リンクのクリックでは動作しないかもしれない
サイトが固定なのなら、本文ページのURLを自力で作成するのが妥当
全部で何ページあるのかとかはそりゃ自分でHtML読んで調べろ

もし単純な<a>リンクであることがわかってるのなら、そりゃその続きを読むリンクがそのページにまだあるかどうかで最終ページの判定すればいいんじゃないの
次のページがないのに次のページのリンクが有効であることはまずない
0012デフォルトの名無しさん2012/07/30(月) 20:13:58.04
さらにもし、現時点でなにを言っているのかさっぱりわからないのなら、それはライブラリの問題ではなくRuby基礎の問題
Rubyの基礎がまったくできていないために、なにもできない状態になっている

ライブラリを使うことは一旦諦めて、Rubyの基礎の勉強をするといい
0013デフォルトの名無しさん2012/07/30(月) 20:47:59.36
>>11
よくわかりました!ありがとうございます!
0014デフォルトの名無しさん2012/07/30(月) 20:55:31.07
gemライブラリはRuby使い倒せるレベルが前提だからなあ
初心者をなんかどうにかして助けてくれるような機能があることはないよ
0015デフォルトの名無しさん2012/07/31(火) 15:14:22.36
いま、Rubyに猪瀬知事が関心を持っている。
【五輪】 開会式、各国のなかで日本選手団だけが"謎の退場誘導"…猪瀬東京都副知事も関心寄せる
http://2ch-ranking.net/cache.php?thread=uni.2ch.net/newsplus/1343712277/&res=100
0016デフォルトの名無しさん2012/07/31(火) 23:04:52.75
>>15
おもしろくないすねー
0017デフォルトの名無しさん2012/08/01(水) 11:19:31.20
>>14
要望を適切に「分解」するのは人力で、それをやるために必要なのは基礎知識と経験だからねえ
今回で言うと「特定の語句があるまでURLの先を取得することを繰り返して本文を溜め込んで返すメソッド」みたいなものを求められても困る

…あっても面白そうな気はするが、デフォルトではたぶん年に1回くらいしか使えなさそうだ(自力で実装したほうが早い)
0018デフォルトの名無しさん2012/08/02(木) 01:13:38.04
module M; Object; end #=> Object
モジュール内からトップレベルの定数が参照出来るのってなんでだっけ

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.13
ようするにこういう状態ですよね
Moduleのインスタンスだってことを見落としてた
class Module < Object
def foo
# ここからObjectの定数が見える
end
end
0022デフォルトの名無しさん2012/08/02(木) 02:30:21.51
>>21
そっすなー

マジカルさ加減で言うとトップレベルがObjectに行くほうがマジカルなんだけど、そこはとりあえずスレ的には丸覚えで
0023デフォルトの名無しさん2012/08/02(木) 05:54:50.91
class Module
X = 0
def foo
X
end
end
module M; end
M.foo #=> 0
module M; X; end #=> NameError

あれ?
0024デフォルトの名無しさん2012/08/02(木) 10:49:51.03
>>18
5番目 (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.56
>>23
class 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
結局>>18の見える理由はなんなんだろう
「例外的にそうなってます」でいいのか、それとも
「○○の範囲が見えて、その中に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.21
質問よろしいでしょうか。

a = gets.chomp
while a != "BYE"
puts "what?"
a = gets.chomp
end

このプログラムをwhat?と聞き返されるたびにBYEと入力して、の繰り返しで三回目にそのループから抜けられるようにするにはどうすればよいでしょうか?
0029デフォルトの名無しさん2012/08/05(日) 01:27:52.18
>>28
カウンタをつける。
0030デフォルトの名無しさん2012/08/05(日) 01:45:13.77
what?と聞かれる前(つまり初回)に入力したBYEもカウントしていいんかな?
そうならまずwhileループをbegin〜end while(ruby版do〜whileの構文)に書き換えてから全体を3.timesで囲むとか
0031デフォルトの名無しさん2012/08/05(日) 02:27:28.02
n = 0
while n < 3
  puts "what?"
  a = gets.chomp
  n += 1 if a == "BYE"
end
0032デフォルトの名無しさん2012/08/05(日) 13:16:54.32
>>29>>30>>31
アドバイスありがとうございます。改善してみました。

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
>>32
> 三回連続でBYEと入力したときだけループから抜けるようにしたいのですが
連続でないと駄目なの?
だったら>>30は忘れて。これは
BYE
HELLO
BYE
BYE
みたいな入力で抜けることだけを想定して書いてるから

基本的には>>31みたいな感じで、BYE以外が入力されたらカウンタをリセットすればいいんじゃないかな
0034uy2012/08/05(日) 14:57:37.95

loop.each_with_object ["","",""] do | _, c |
  puts "what?"
  a = gets.chomp
  p a
  c << a
  c.shift
  break if c.join == "BYE"*3
end
0035uy2012/08/05(日) 15:22:44.83
ミスった これcycleでいいや

loop.each_with_object ["","",""] do | _, c |
↓
[["","",""]].cycle do | c |
0036デフォルトの名無しさん2012/08/05(日) 18:02:50.69
馬鹿には無理
0037デフォルトの名無しさん2012/08/06(月) 00:13:49.90
>>34
joinしてからの判別だと、BY EBY EBYE みたいな入力でも通ってしまう
0038デフォルトの名無しさん2012/08/06(月) 00:33:56.67
n = 0
while 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
>>39
わかんないなら先進むのやめとけ
理解が先
わかんないのにさらに要素増やしてどうする
■ このスレッドは過去ログ倉庫に格納されています