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

Ruby初心者質問スレPart2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん05/02/08 03:02:27
オブジェクト指向スクリプト言語Rubyについての質問スレッドです。
Ruby Home Page
http://www.ruby-lang.org/ja/

前スレ
Ruby初心者質問スレPart1
http://pc5.2ch.net/test/read.cgi/tech/1100534824/

本スレ
Rubyについて Part 14
http://pc5.2ch.net/test/read.cgi/tech/1103997158/

0002デフォルトの名無しさん05/02/08 03:03:17
= 関連スレ
: 【Ruby】RubyでCGI
 http://pc5.2ch.net/test/read.cgi/php/988948655/
: 【最高言語】 Rubyist Magazine創刊 【ルビま!】
 http://pc5.2ch.net/test/read.cgi/tech/1094825807/
= 関連スレ?
: RUBYの宿題教えてください。
 http://pc5.2ch.net/test/read.cgi/tech/1106572657/


= 関連リンク
: リファレンス
 http://www.ruby-lang.org/ja/man/
: Ruby Weekly News @ Ruby Garden
 http://www.rubygarden.org/rurl/html/
: ruby-cvs
 http://rrr.jin.gr.jp/rwiki?cmd=view;name=ruby-cvs
: Ruby hotlinks 五月雨版
 http://rrr.jin.gr.jp/~znz/samidare/
: 日本Rubyの会
 http://jp.rubyist.net/
: Rubyist Magazine
 http://jp.rubyist.net/magazine/
: <rubyXML/>
 http://www.rubyxml.com/
: Matzにっき
 http://www.rubyist.net/~matz/
0003デフォルトの名無しさん05/02/08 03:22:39
Thread.new乙
0004デフォルトの名無しさん05/02/08 03:26:23
Rubyの会のサイトはIEで表示がおかしくなる貴重なサイトだな
0005デフォルトの名無しさん05/02/08 03:55:35
スレ統合するんじゃなかったっけ
0006デフォルトの名無しさん05/02/08 10:18:01
無職なんですがRuby覚えたらご飯食べれるようになりますか?
0007 ◆m7YeytgDFE 05/02/08 10:29:46
>>6
可能性がわずかにはあるかも。開発にRubyを使う案件って稀みたいです。
C++など他の言語で開発する際に、支援ツールをさくっと作るには便利ですよ。
私もそれでかなり重宝してます。
0008デフォルトの名無しさん05/02/08 12:03:30
>>5
実質的に統合されるなら削除依頼出します。
0009デフォルトの名無しさん05/02/09 07:08:10
こっちはこっちで需要あるから
別に統合しなくても良いと思うよ
0010デフォルトの名無しさん05/02/09 14:03:12
同感。
前スレも3ヶ月で1スレ消費程度に需要があったし。
……MW 祭りやらスクリプト爆撃の影響が、かなりある気がするけど。
0011デフォルトの名無しさん05/02/09 15:07:28
>>10
MW版Rubyの進捗状況が気になって同氏のWikiを拝見しようと思ったら、
サーバが落ちてました...。一時的なダウンなのかな?
0012デフォルトの名無しさん05/02/09 16:48:49
割と頻繁に落ちてますね。
なお、進捗なんてないのでいちいち見る必要はなさそうです。
0013デフォルトの名無しさん05/02/09 20:44:56
本人が落ちてます。
0014デフォルトの名無しさん05/02/10 09:24:15
だから 2ch のカキコが止まったのか。
0015デフォルトの名無しさん05/02/11 14:07:47
ここで暴れてるようでつhttp://pc5.2ch.net/test/read.cgi/tech/1103997158/
0016デフォルトの名無しさん05/02/13 08:38:33
長文ですみませんが、教えてください。

文字列を外からあたえて、それに応じてインスタンスを
作成する方法に関してです。以下では、簡単のために、
ClassAと ClassB の二つにして説明します。
class ClassA
 def initialize
  end
 def out
  puts 'AAAA'
 end
end
class ClassB
 def initialize
 end
 def out
  puts 'BBBB'
 end
end
(1)引数で ClassA もしくは ClassB という文字列を与えて、
 二つを使いわけることを考えます。
 もちろん、場合分けして明示的に書けば可能です。
(次の記事に続きます)
0017デフォルトの名無しさん05/02/13 08:39:15
(2)しかし、場合分けせずに、そのままやろうとすれば、
以下のようにeval を使うことになります。
(ここももっと良い方法があれば教えてください。)

str = ARGV.shift  # 引数として ClassA を与える
eval('x = ' + str +'.new')
eval('x.out' )   # << ==== (*)

(3) 質問は(*)の行に関してですが、
(Q1) evalを使わないとエラーになるのは何故でしょうか。
(Q2) x を使った作業が以下に延々と続くとした場合、
  逐一evalを使用するのがうっとおしい。
  何か回避策があるでしょうか。

以上です。よろしくお願いします。
0018デフォルトの名無しさん05/02/13 09:49:45
x = (Module::const_get("ClassA")).new
x.out

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40021
からのスレッドが参考になると思う。
0019デフォルトの名無しさん05/02/13 10:55:08
おお、ありがとうございました。助かりました。
結城さんのデザインパターン本(Javaによる)を読みながら
rubyに引きなおして考えています。そのなかでの疑問でした。
教えていただいたスレッドによると、FAQのようですが、
かずひこさんもすぐには思い付かなかった様子ですので、
サンデープログラマとしてはちょっと安心もしてます。<grin>
勉強になりました、感謝します。
(Q1)の関係でbindingというのも知りました。
0020デフォルトの名無しさん05/02/13 16:06:51
>>17
クラス名があらかじめ列挙できるなら
hash = { "ClassA" => ClassA, "ClassB" => ClassB, }
klass = hash[ARGV.shift]
obj = klass.new if klass
クラス名があらかじめわからない場合は、この方法は使えないけど。
0021デフォルトの名無しさん05/02/13 17:28:56
Ruby製2chブラウザのエンジン部分ってない?
0022デフォルトの名無しさん05/02/13 20:47:33
使ったことないからハズしてるかもしれないけど
goRua <ttp://www.unixuser.org/~haruyama/software/goRua/> とか
0023デフォルトの名無しさん05/02/18 19:25:18
Windows だと MySQL/Ruby も Ruby/MySQL も
/tmp/mysql.sock がなくて経由できなくて使えないのだが、そういうものなの?
0024デフォルトの名無しさん05/02/18 20:33:42
>>23
ttp://kobe.cool.ne.jp/matsut/ruby_mysql.html
ttp://www.mysql.gr.jp/mysqlml/mysql/msg/9811
00252305/02/18 21:00:23
>>24
ありがとん。
つか、普通に 127.0.0.1 で逝けたのね orz
ちゃんと設定すれば hostname でも可能なのかもしれない。
Ruby/MySQL の方は MySQL の方のバージョンが高くて駄目ぽ。
あとは地道におぼえていこう......
0026デフォルトの名無しさん05/02/25 01:56:52
'Ruby' -> ['Ru', 'ub', 'by']
みたいに String を bigram に分割したいのですが、
どう書くのが普通なんでしょうか。

下のメソッドみたいな1文字ずつに分割しといて後で2つくっつける方法よりも、
2文字マッチさせて1文字ずらす方法の方が効率よさそうに思うのですが
うまくコードが書けません。

def bigram(str)
prev = nil
str.scan(/./).inject([]) do |result,ch|
result << prev+ch if prev
prev = ch
result
end
end
0027デフォルトの名無しさん05/02/25 02:21:18
s="ruby"
(0..(s.size-2)).collect{|i| s[i..i+1]}
#=> ["ru", "ub", "by"]
0028デフォルトの名無しさん05/02/25 04:14:35
s="るびぃ"
0029デフォルトの名無しさん05/02/27 00:36:12
下のコードだと、"."や".."がディレクトリということで、
「File.openできません」と言われます。ensureではだめなの
でしょうか?

dir = Dir.open(".")
begin
dir.collect{|f| [f]}.each do |fname|
begin
file = File.open(@dir + fname, "w")
while line = file.gets
print line
end
file.close
rescue
file.close
raise
end

end
ensure
dir.close
end
0030デフォルトの名無しさん05/02/27 02:07:02
通常ファイルだけ open すれば。

Dir.foreach('.') do |fname|
next unless FileTest::file?(|fname|)
fp = File.open(@dir + |fname|, "w")
...
end
0031デフォルトの名無しさん05/02/27 02:08:34
ミスった。
Dir.foreach('.') do |fname|
  next unless FileTest::file?(fname)
  fp = File.open(@dir + fname, "w")
  ...
end
0032デフォルトの名無しさん05/02/27 05:53:06
Dir.entries(".").select{ |fname| /^\.{1,2}$/ !~ fname }
0033デフォルトの名無しさん05/02/27 09:35:41
初心者です。
a[1,2,3,4]
a[1,0] = 6
a == [1,6,2,3,4]
最後の評価がtrueにならないのはなぜですか?
0034デフォルトの名無しさん05/02/27 09:36:25
a = [1,2,3,4]
の誤りですた
0035デフォルトの名無しさん05/02/27 10:18:43
>>30-32
ありがとうございます。nextとFileTestを組み合わせるのが、
私には理解しやすかったです。(まつもとさんのruby本では、
FileTestの記述が少ないですね。)
0036デフォルトの名無しさん05/02/27 11:19:06
obj.eql?をオーバーライドして呼び出すと以下の警告が出てしまいます。

parenthrsize argument(s) for future version.

理由がよくわかりません・・・
0037デフォルトの名無しさん05/02/27 12:46:35
>>33
何がしたいのか分からんが
a = [1,2,3,4]
a[1,0] = 6
p a
0038デフォルトの名無しさん05/02/27 15:07:17
>>36
将来問題が出る可能性のある書き方をしているから。
というか、実際のコードを出さない理由がよくわかりません・・・
0039デフォルトの名無しさん05/02/27 15:15:50
関数の引数を括弧で括るとか
0040デフォルトの名無しさん05/02/27 16:11:31
>>38
失礼しますた。

class Point
attr_reader :x,:y

def initialize(x,y)
@x = x
@y = y
end

def eql? other
self.class == other.class and
@x == other.x and
@y == other.y
end
end

p1 = Point.new(1,1)
p2 = Point.new(2,3)


p1.eql? p2 # 警告
p1.eql?(p2)
00414005/02/27 16:14:09
>>39
なぜ括弧で括ると警告が出ないのですか?
0042デフォルトの名無しさん05/02/27 16:39:48
>>41
構文解釈の問題だ
0043デフォルトの名無しさん05/02/27 17:08:56
>>40 をコピペしても警告出ないんだけど、それはともかく
括弧の省略が重なった時に出るんじゃないの?

$ ruby -e 'p p 0, 1'
-e:1: warning: parenthesize argument(s) for future version
0
1
nil

p(p(0,1)) なのか p(p(0),1) なのか曖昧なので、
(今のところ前者と解釈してるけど)今後はこの書き方はやめようね、と。
00444005/02/27 17:27:56
>>43
puts p1.eql? p2
とやってました。
puts(p1.eql?,p2)とputs p1.eql?(p2)
が近い将来曖昧になりえるということですね。
どうもありがとうございました。

0045デフォルトの名無しさん05/02/27 17:30:34
SJISの文字コードのテキストファイルの中身を全てコンソールに表示する
プログラムを書く場合エンコードの指定とかってできますか?
0046デフォルトの名無しさん05/02/27 17:55:41
1行目を #!/usr/bin/ruby -Ks
もしくは $KCODE = 's' を指定する

で、駄目?
0047デフォルトの名無しさん05/02/27 19:01:22
>>44
> puts(p1.eql?,p2)とputs p1.eql?(p2)
> が近い将来曖昧になりえるということですね。
もともと曖昧なので「これからはそういう書き方はヤメロ」といわれてるのだよ。
0048デフォルトの名無しさん05/02/27 19:03:07
>>45
SJISの文字コードのテキストファイルの中身を全てSJISの文字コードのコンソー
ルに表示するだけなら、エンコードの指定って関係ないはずだが。
IO.foreach("inputfile"){|line| print line}
0049デフォルトの名無しさん05/02/28 02:36:27
write(File.read("inputfile")) でいいじゃん。
0050デフォルトの名無しさん05/02/28 05:43:58
良いのか?
print なら解るが。
0051デフォルトの名無しさん05/02/28 08:22:15
>>49
でかいファイルだとメモリが…
0052デフォルトの名無しさん05/02/28 13:43:35
>>50
printとwriteの違いは何?
0053デフォルトの名無しさん05/02/28 14:27:51
>>52
違いっていうか、 Kernel#write ってそもそもあったっけ?
0054デフォルトの名無しさん05/02/28 17:35:48
>>52
ソースを確認してないけど、
print, puts, putc, << ここら辺は内部で write が呼ばれてるんだっけ?
でも、>>45 で「コンソールに表示する」と書かれてるから、
>>49 のままでは使えないと思っただけ。
$stdout.write(File.read("inputfile")) なら解る。
ズレたこと言ったのならゴメンよ。
0055デフォルトの名無しさん05/03/02 05:11:46
print LF->CRLFに変換される
write 変換なし
0056デフォルトの名無しさん05/03/02 14:31:53
改行コードの変換はbinmode次第であって、メソッドによって変わるわけではない。
0057デフォルトの名無しさん05/03/02 14:59:33
で、正解は?
0058デフォルトの名無しさん05/03/02 21:09:27
IO.foreach("inputfile"){|line| print line}
IO.foreach("inputfile", &method(:print))
$stdout.write(File.read("inputfile"))
0059デフォルトの名無しさん05/03/02 23:21:06
STDOUT.print nil
STDOUT.write nil

とか。あとprintは$_、$,、$\を使う、戻り値がprint => nil、write => 出力できたバイト数、とか。
0060デフォルトの名無しさん05/03/03 02:32:32
宿便が出てすっきりした気分
0061デフォルトの名無しさん05/03/03 02:42:04
つまりwriteイラネってこと?
0062デフォルトの名無しさん05/03/03 12:56:48
>>61
>>54
0063デフォルトの名無しさん05/03/04 00:43:30
open("inputfile"){|f| $>.write(f.read(1048575)) until f.eof?}
0064デフォルトの名無しさん05/03/05 06:23:16
C言語のi++はRubyではどう書くの?
0065デフォルトの名無しさん05/03/05 06:39:58
i+=1
0066デフォルトの名無しさん05/03/05 09:37:10
i = i.succ

なんでInteger#succ!がないんだろ
0067デフォルトの名無しさん05/03/05 10:58:59
Fixnumがmutableだから
0068デフォルトの名無しさん05/03/05 14:24:19
>>66
1.succ!ってやったら1==2になっちゃうなんてのはイヤだろ?
0069デフォルトの名無しさん05/03/05 15:08:03
Fixnum が immutable な Ruby があったなら、こんな FAQ が発生することはなかった?
00706705/03/05 15:14:36
X Fixnumがmutableだから
O Fixnumがimmutableだから
00716905/03/05 15:38:52
X Fixnum が immutable な Ruby
O Fixnum が mutable な Ruby

つられて間違ってしまった・・・orz
0072デフォルトの名無しさん05/03/05 22:39:17
mutableかどうかじゃなくてsingletonの話だって言ってるだろ!!!
0073デフォルトの名無しさん05/03/05 22:57:05
バカか。mutableの話だ。

Cで1++ってやったら1==2なんのか?あ?
0074デフォルトの名無しさん05/03/06 00:55:27
バカか。mutableかどうかじゃなくて即値かどうかの話だって言ってるだろ!!!
0075デフォルトの名無しさん05/03/06 03:00:40
もうすっかり春らしくなってきたな
00766405/03/06 04:31:34
>>65
アリガ�d
i.succ!って書いてしまった100万人目の初心者でした
0077デフォルトの名無しさん05/03/09 06:25:27

p "『".gsub!('a','A')

がうちの環境ではnilになるのですがどうしてですか。

コードはEUCです。
0078デフォルトの名無しさん05/03/09 06:37:06
gsub! は破壊的に変更し、変更がなかったら nil を返します。

str = "『"
p str.gsub!('a','A') #=> nil
p str #=> "『"

str = "abc"
p str.gsub!('a','A') #=> "Abc"
p str #=> "Abc"

対して gsub は、変更した文字列を返し(変更されなかったらコピー)、
元の文字列はそのままです。

str = "『"
p str.gsub('a','A') #=> "『"
p str #=> "『"

str = "abc"
p str.gsub('a','A') #=> "Abc"
p str #=> "abc"

0079デフォルトの名無しさん05/03/09 06:45:47
素早い回答、ありがとうございます。
やってみたら、本当ですね。
!のあるなしでかなり違うのですね。
初心者バレバレです。精進します。
0080デフォルトの名無しさん05/03/09 18:55:16
それが人に教えを請う態度かアアン?
仮に漏れがバカだとしてバカでも知っている常識すら知らないことを威張るなよ低能が。
0081デフォルトの名無しさん05/03/09 19:09:44
>>79
!が末尾についているメソッドは、ついていないメソッドと同等の効果があっ
て自身を変更する。戻り値については nil だったりいろいろ。

なので、戻り値は考えないで自分自身を書換える場合は gsub! などを使い、
自分自身を書換えずに戻り値を使いたい場合は gsub を使う、とかいう風に使
いわけるといいよ。

といっても、文法的に決まってたりとかいう事ではぜんぜんないので、そのメ
ソッドが自分自身を本当に破壊的に変更するかどうかはあらかじめ確認しとい
た方がいい(Array#rejectあたりが典型例)。
0082デフォルトの名無しさん05/03/09 20:55:05
質問です。
>>1 のページのチュートリアルは何故あんなにセンスが悪いんすか?
0083デフォルトの名無しさん05/03/09 21:15:43
>>82
m9(^Д^)プギャ-
0084デフォルトの名無しさん05/03/10 01:51:54
foo! は foo とくらべてより破壊的。
だからといって foo が破壊的でないとは限らない。
0085デフォルトの名無しさん05/03/10 18:58:09
もう単なる一山幾らの煽りになっちゃってるな。
喋れば喋るほど知能の低下を如実に現してる。

こーいうのが偉そうに喋ってたのかよw
相手してた奴が恥ずかしいなw
0086デフォルトの名無しさん05/03/10 19:54:41
ある説が「間違っている」というのは、その説の結論が正しくないということではありません。
その説が結論に至る過程が正しくないということです。
ですから、結論を肯定することも否定することもその説が正しいかどうかの検証にはなりません。
理論というものは例で補強されるものではなく理屈で補強されるものです。
例などはなくても考え方の筋道が通っていれば正しいのですし、
逆にいくら例があっても筋道の通っていない考え方は間違いなのです。
なお誤解のないように付け加えておきますが、「例を示す」というのは筋道の通った考え方の一つです。
例を示さなくていいとか例を示してはいけないというわけではありません。
例を示しさえすればいいというのが間違いなのです。
0087デフォルトの名無しさん05/03/10 21:43:56
>>86
完璧に同意。

そして理論というものはトップダウンにかくと分かりやすいものなのだが、
その理論の入り口にいる時にはトップダウンに抵抗を感じるもの。
そのことがマニュアルやチュートリアルをかくことを難しくしているのだと思う。
こういう時は「目的」や「例」などをふんだんに使いながら低い所から登って行くしかない。
0088デフォルトの名無しさん05/03/11 01:11:16
やっぱRuby使うやつって特に変なの多いな。
0089デフォルトの名無しさん05/03/11 01:31:23
目糞鼻糞を哂うとはこのことだな
0090デフォルトの名無しさん05/03/11 18:32:39
String.inspect の挙動が最近変更になったせいで、以下のようなスクリプト
が動かなくなったんですが、良い解決策ありませんか?
「erb使え」ちゅうのは無しで。

str = '"a" = #{a}'
s = "12"
puts eval( str.inspect )

以前の結果、"a" = 12
現在の結果、"a" = #{a}
0091デフォルトの名無しさん05/03/11 18:36:13
>>90
s="12" は、a="12" の間違いです。
0092デフォルトの名無しさん05/03/11 19:17:51
>>90-91
puts eval(str.inspect.gsub(/\\(?=#[$@{])/n, ''))

inspectとevalはできるかぎり逆変換になることが期待されるので、
今のほうが本来意図された動作。
00939205/03/11 19:27:23
ごめん、nオプションはナシ。
0094デフォルトの名無しさん05/03/11 21:22:18
>>92
いや、inspectにはそんなことは期待されてない。
evalしたいならString#dumpを使うのが正しい。
それ以外は92の言ってる通り。
0095デフォルトの名無しさん05/03/11 21:53:07
dumpはStringくらいしかないじゃん。
0096デフォルトの名無しさん05/03/11 22:10:52
>>94
でも inspect にそんなことを期待している人は意外と多い罠。
0097baka05/03/11 22:43:31
TeX2pageで作られたHTMLファイルから元のTeXソースを作りたいのですが、
そんなことできるソフトなさそうなので自分でちゃっちゃっとスクリプト書こうと思っています。
といってもあまりノウハウがないので、なにか参考になるページあったら教えてください。
0098デフォルトの名無しさん05/03/11 23:08:02
TeX2pageのソース。
で、Rubyはどの程度書けるわけ?
0099デフォルトの名無しさん05/03/11 23:33:48
小泉首相が感動するぐらい書けるけどそれが何?

逆に聞くけど、お前はどの程度なわけ?
0100baka05/03/12 00:01:08
Rubyはあまり描けないっす。ってかTeX2pageってCで書かれてますよね?
汎用的なのだと難しいから、ひとまず今変換したいやつだけ変換できれば良いので。

ちょっとRAAを覗いてみます。Rubyコミュニティってなんとなく感じ悪い…
0101デフォルトの名無しさん05/03/12 00:28:48
>>100
ところでTeX2pageってこれ?
http://www.ccs.neu.edu/home/dorai/tex2page/tex2page-doc.html
Schemeとかで動くって書いてあるから多分別物だと思うけど……。
■ このスレッドは過去ログ倉庫に格納されています