Ruby 初心者スレッド Part 26
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/02/27(金) 18:38:24【Ruby1.9.1 は従来版とは別物であり、書籍や解説やライブラリのサポートがまだありません】
【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です
※ただし 1.8.6 より安定しているとはまだ言えないので、安定性を第一とする用途には 1.8.6 をどうぞ
関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0153デフォルトの名無しさん
2009/03/07(土) 21:28:58FreeBSDだと、Pythonだからインストーラーに採用できないとかもあったりするねw
まあRubyよりライセンスが緩いから、だいぶいいんだけど・・・
そう言えば、Ruby on HSPはマダなの?
早くしないと日本でもPythonに負けそうな勢いだ
ライブラリとドキュメント早くなんとかしないとね
>>152
Pythonの方がコミュニティが優秀って事だろう
0154デフォルトの名無しさん
2009/03/07(土) 21:36:18RubyとしてはHSPに乗っかる理由がない
Tk並にGUIが分離してるなら良かったんだが
0155デフォルトの名無しさん
2009/03/07(土) 21:36:44>Ruby on HSP
HSPでRuby実装・・・?
0156デフォルトの名無しさん
2009/03/07(土) 21:39:19HSPをGUIフロントエンドとして使うという意味だろう
そんなことやってる人いないけど…
RubyとHSP間のトランスレータなら、そんなん無駄だから他のことやったほうが有意義
0157デフォルトの名無しさん
2009/03/07(土) 21:53:00>Ruby on HSP
HSP様の人気にのっかると言う意味です。
最低でも、あのくらいは頑張ってくれないと・・・
0158デフォルトの名無しさん
2009/03/07(土) 21:55:15Ruby十分人気だろ
0159デフォルトの名無しさん
2009/03/07(土) 22:00:17業務に使われる割合が PHP よりも Perl よりも少ないというだけで、人気は普通にある
0160デフォルトの名無しさん
2009/03/08(日) 00:17:13変換する方法ってありますか?
0161デフォルトの名無しさん
2009/03/08(日) 00:26:22書籍発行数だけでも、さすがにHSPより上じゃないの?
0162デフォルトの名無しさん
2009/03/08(日) 00:27:08もっと危機感煽るなら、AIRくらいにしとかないとw
0163デフォルトの名無しさん
2009/03/08(日) 00:30:46Time#yearとTime#monthとTime#dayで年月日が得られるからそれをDate.newあたりに指定するのが先決
Time#strftimeの使い方を覚えるのでもいい
0164デフォルトの名無しさん
2009/03/08(日) 00:32:39わかりました、やってみます。
さいしょ、Time#strftimeで文字列比較しようとしたのですが
ゲボゲボなのでやめました。
ありがとうございました。
0165デフォルトの名無しさん
2009/03/08(日) 00:34:17mtime = File.mtime('readme.txt')
mdate = Date.new(mtime.year, mtime.month, mtime.mday)
とするのがとりあえず初心者スレだと思う
0166デフォルトの名無しさん
2009/03/08(日) 00:46:29何度もすみません、
p Date.new === Date.new(2009, 3, 8) #=> false
となってしまうのですが、これはなぜでしょうか?
ちなみに
t0 = Date.new
sleep 10
t1 = Date.new
p t0 === t1 #=> true
これは期待通りです(;_;)
0167デフォルトの名無しさん
2009/03/08(日) 01:04:01マニュアルくらい読めよ
> Date
> 日付を扱うクラスです。
> クラスメソッド
> civil([year[, mon[, mday[, start]]]])
> new([year[, mon[, mday[, start]]]])
> 暦日付に相当する日付オブジェクトを生成します。
って引数省略時の動作書いてねええええ
Date.new とだけしたときは、Time.new が現在時刻を返すのと同様、現在の年月日の Date オブジェクトを返す
0168デフォルトの名無しさん
2009/03/08(日) 01:07:16間違ってるぞ
Date.new は Date.new(0, 0, 0) だ
今日の日付が欲しいときは Date.today を使う
なんで Time.new と同じ動作にしなかったのかは若干謎
0169デフォルトの名無しさん
2009/03/08(日) 01:13:20納得しました。
0170デフォルトの名無しさん
2009/03/08(日) 02:00:12Rubyは標準でデータベースを持っていたり、推奨DBがあったりしますか?
0171デフォルトの名無しさん
2009/03/08(日) 03:08:560172デフォルトの名無しさん
2009/03/08(日) 03:24:04これ見たんじゃない?
Linux標準にPerlとPythonが追加 − @IT
ttp://www.atmarkit.co.jp/news/200802/20/lsb.html
Rubyなんて海外じゃ全然ダメだし、どう考えても入らないよな・・・
Pythonはインストーラーやパッケージシステムなんかにも採用されているし、もう十分標準なんだろうな
0173デフォルトの名無しさん
2009/03/08(日) 07:25:33別にGUIを否定はしてないでしょ。興味ないだけで。
0174デフォルトの名無しさん
2009/03/08(日) 13:40:070175デフォルトの名無しさん
2009/03/08(日) 19:37:52標準では付いてない。PHPやPythonとは違ってなんでも詰め込んだりしない。
本格指向ならMySQL、普通の人は軽めのSQLiteにしておけばいいと思う。
松本教祖達が興味ない分野が死んでしまうのは痛いな
広めようという気がないのだから
0176デフォルトの名無しさん
2009/03/09(月) 00:07:06無関心は、否定よりも困る。
議論の対象にもならないのだから。
0177デフォルトの名無しさん
2009/03/09(月) 09:54:040178デフォルトの名無しさん
2009/03/09(月) 12:53:48標準添付の Ruby/Tk のことも思い出してあげて下さい
require 'tk'
Tk.mainloop
で窓ができるんだぞ
0179デフォルトの名無しさん
2009/03/09(月) 16:40:30たとえばhttp://stock.2ch.net/test/view.so?bbs=tech(2証プログラム)
などログインが必要なところにアクセスしようと思ったらどうすればいいのでしょうか
参考になるURLなど紹介していただけるとありがたいです
0180デフォルトの名無しさん
2009/03/09(月) 17:49:52HTTPとHTMLの勉強をしてください
Rubyはそれらをほとんど抽象化しません
0181デフォルトの名無しさん
2009/03/09(月) 17:55:27ありがとうございます。
その辺勉強してきます。
0182デフォルトの名無しさん
2009/03/09(月) 18:36:26文字列とかシンボルから属性をとりだしたいってことなんですけども。
method("属性名").callでよいのかな?
↓みたいなことをやりたいのだけど。
%w(hage, mage, moge).each do|x|
iroiroyaru(method(x + "_items").call)
end
0183デフォルトの名無しさん
2009/03/09(月) 18:55:060184デフォルトの名無しさん
2009/03/09(月) 18:57:03やろうとしてることがいまいちピンとこなくて何だけど、とりあえず
attr_accessor :foo
と
def foo
@foo
end
def foo=(x)
@foo = x
end
が等価。
だからObject#methodでもいいし、Object#sendでもいいし。
0185デフォルトの名無しさん
2009/03/09(月) 19:01:41ちょっと的外れだけど instance_variable_get
0186デフォルトの名無しさん
2009/03/09(月) 20:03:27puts obj.send(x)
end
とか
0187デフォルトの名無しさん
2009/03/09(月) 20:09:51>>185
属性=変数の場合はそれでも十分いけますね。
>>186 >>184
実質的に、メソッドなんですね。
おお、sendで一発でいけるのか。
0188デフォルトの名無しさん
2009/03/09(月) 20:24:05def hoge; @hoge; end
def hoge=(v); @hoge=v; end
と書く代わりに
attr_accessor :hoge
と略記することができる、というだけに過ぎない
hoge はただのインスタンスメソッドで、スクリプト上全く特別扱いされない
これを特別扱いするのはマニュアルシステムのRDocくらいだ
0189デフォルトの名無しさん
2009/03/09(月) 20:40:190190デフォルトの名無しさん
2009/03/09(月) 21:18:07attr_accessor の仕組みを知って、類似のメソッドを自分でも書くようになると
確実にスクリプトの変態度が増すぞw
面白いから module_eval とか調べてみれ
0191デフォルトの名無しさん
2009/03/09(月) 21:19:10Array等の方法で先に配列を作り、必要となる都度そこに代入するしか方法は無いのでしょうか?
普通の配列を @a = [] の様な方法で要素数を気にせず宣言するような事をしたいです。
0192デフォルトの名無しさん
2009/03/09(月) 21:27:59def <<(e)
self.push(e.to_s.downcase)
end
end
data = MyData.new
data << "ONE"
data << "TWO"
p data #=> ["one", "two"]
こんなん?
委譲するべきだけど、最初は小難しいだけだから配列を継承するのが簡単
0193デフォルトの名無しさん
2009/03/09(月) 21:31:58継承してselfに対して操作してもいいし
class Foo < Array
def puts
puts self
end
end
委譲してもいい。
class Foo
def initialize
@data = []
end
def <<(x)
@data << x
end
end
実装がArrayそのままなら要素数の宣言はいらない。
0194デフォルトの名無しさん
2009/03/09(月) 21:33:27>>191が欲しいのは、自分の作ったクラスインスタンスの配列なのではなかろうか。
0195デフォルトの名無しさん
2009/03/09(月) 21:34:44student[0]〜student[100] があってそれぞれに
student[0].math
student[0].english
student[0].japanese
という感じの事です。
Studentsクラスだったとすると
student = []
student[0] = Students.new
student[1] = Students.new
・
・
・
をfor文なりでやるしかないのでしょうか?
0196デフォルトの名無しさん
2009/03/09(月) 21:36:12class Foo
def initialize
@@member ||= []
@@member << self
end
end
0197デフォルトの名無しさん
2009/03/09(月) 21:37:06students = []
100.times.do
students << Student.new
end
0198デフォルトの名無しさん
2009/03/09(月) 21:38:33class Foo
def Foo.create(num)
ary = []
(0..num).each { ary << Foo.new }
ary
end
end
0199デフォルトの名無しさん
2009/03/09(月) 21:41:40作るのは>>197
配列要素各々のオブジェクトにメソッドを実行してほしい場合は単にそのように書く
students.each do |student|
puts "数学の成績は #{student.math} です"
puts "英語の成績は #{student.english} です"
puts "国語の成績は #{student.japanese} です"
end
というか、Rubyについての基礎知識が全く無いように見受けられる
本か何かで体系的な学習をしてから動くことをお勧め
0200デフォルトの名無しさん
2009/03/09(月) 21:45:08まだわからない部分があってなるほど!とは思えませんが、自分で調べてみます。
最初に上手く説明できずすみませんでした。
ありがとうございました。
0201デフォルトの名無しさん
2009/03/09(月) 21:46:06students = Array.new(100) { Student.new }
0202デフォルトの名無しさん
2009/03/09(月) 21:48:10それはスレ的によくないと思う
0203デフォルトの名無しさん
2009/03/10(火) 14:02:58FileUtils.rm("dist/*")
としたら
usr/lib/ruby/1.8/fileutils.rb:1297:in `unlink': No such file or directory - dist/*.png (Errno::ENOENT)
と言われます。
本当はどうすればいいのでしょうか?
0204デフォルトの名無しさん
2009/03/10(火) 14:07:37system("rm -R dist/*")
0205デフォルトの名無しさん
2009/03/10(火) 14:13:48適当に Dir.chdir しろ
Dir.pwd の結果がたぶん意図しないディレクトリになってる
0206デフォルトの名無しさん
2009/03/10(火) 14:19:10そうじゃなくて FileUtils.rm("dist/*") で全部消せないでしょうか(distは消さない)?
カレントディレクトリには間違えなくdistがあります。
0207デフォルトの名無しさん
2009/03/10(火) 14:30:090208デフォルトの名無しさん
2009/03/10(火) 14:32:30FileUtils.rm とかって単独でグロブを展開できないんじゃないの?
現にエラー見る限り * が展開されてないじゃん
Dir.glob("dist/*").each do |f|
FileUtils.rm(f)
end
とかでいけるんじゃないか。
0209デフォルトの名無しさん
2009/03/10(火) 14:36:10マニュアル眺めれば見当つくが、引数は配列だ
>>208ではなく、Dir.glob の結果をそのまま渡せばいい
0210デフォルトの名無しさん
2009/03/10(火) 14:48:250211デフォルトの名無しさん
2009/03/10(火) 19:19:380212デフォルトの名無しさん
2009/03/10(火) 23:09:56return Integer(n) で戻り値を整数にして返します。
n = (中略) * (calc_a / calc_b)
という処理をした時に (calc_a / calc_b) の時点で小数点以下が切り捨てられてしまいます。
(calc_a / calc_b) は本来 1 より大きく 2 より小さい値にしようと思っていたのですが、どうすればよいでしょうか?
0213デフォルトの名無しさん
2009/03/10(火) 23:14:42n = (中略) * (calc_a.to_f / calc_b)
でいいんじゃね。
0214デフォルトの名無しさん
2009/03/10(火) 23:18:23…特に書いてねえええ
整数のメソッドの返り値は整数になってる
小数つきの値を返して欲しいなら小数つき数字のクラスの割り算メソッド使え
irb> 10 / 3
3
irb> Float(10) / 3
3.33333333333333
0215デフォルトの名無しさん
2009/03/10(火) 23:46:26無事解決しました。
ありがとうございました。
0216デフォルトの名無しさん
2009/03/11(水) 09:05:39Integer(1.1)
これって何?キャスト???Ruby使ってて始めてみたw
to_fとかto_i使うもんだと思ってた
0217デフォルトの名無しさん
2009/03/11(水) 09:07:03to_f, to_iとの違いはなんだろ。
レシーバーをもつメソッドの違いとかなし
0218デフォルトの名無しさん
2009/03/11(水) 09:13:17http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#Integer
http://www.ruby-lang.org/ja/man/html/String.html#to_i
0219デフォルトの名無しさん
2009/03/11(水) 09:14:43ただの関数的メソッド
URI('http://www.example.com'') なんかも有名だが、こんなふうに作る
module Kernel
def URI(uri_str)
URI.parse(uri_str)
end
module_function :URI
end
たいていは特定のクラスメソッドや new つきインスタンスメソッドの別記だけど、
Integer() や Float() のように、特定言語のアレっぽい便利な「ちょっと違う処理」を噛ませてある場合も多い
irb> "10".to_f
10.0
irb> "a".to_f
0.0
irb> Float("10")
10.0
irb> Float("a")
ArgumentError: invalid value for Float(): "a"
0220デフォルトの名無しさん
2009/03/11(水) 09:26:53素直に「そのクラスのオブジェクトへの変換メソッドのエイリアス」とだけ設定してほしかった
0221デフォルトの名無しさん
2009/03/11(水) 10:20:30関数側で未定義なクラスならto_i等を呼ぶから結果的にエイリアスとしても
振る舞うだけで、関数自体はエイリアスという位置づけでもないし。
0222デフォルトの名無しさん
2009/03/11(水) 10:25:33(゚д゚)ウマー ってことじゃないの
0223デフォルトの名無しさん
2009/03/11(水) 11:35:11Integer.convert があってそれを Integer() 内で呼んでる、とかそういうめんどっちい構造にすべきだった
いきなり関数形式のメソッドだけ提供されても正直困る
0224デフォルトの名無しさん
2009/03/11(水) 11:43:40名前がたまたま同じだけの、ただの Kernel クラスのメソッド
URI() の定義を初めて見たときは激しくがっかりしたことを覚えている
クラスそのもののオブジェクトに引数を渡す方法があるのかとかちょっと期待してた俺
0225デフォルトの名無しさん
2009/03/11(水) 16:24:02まあ教祖が放置してるぐらいだから、信者の皆さんに不満は無いのだろうけど。
0226デフォルトの名無しさん
2009/03/11(水) 16:35:53いくつか用意する方針には納得している
do endとブレース、Procとlambdaみたいなのは、使ってて確かに両方必要だと感じるので
ってかどうせ、変えたら変えたでまた批判されるでしょ?
0227デフォルトの名無しさん
2009/03/11(水) 16:51:39優先順位が同じになったら困る人が大量発生するだろうなw
0228デフォルトの名無しさん
2009/03/11(水) 17:25:54数字じゃありませんってエラー出せよ
0229デフォルトの名無しさん
2009/03/11(水) 17:29:20文字列と数値の処理は変なの入れるとRubyスクリプト全体が遅くなるから嫌がられそうだが
0230デフォルトの名無しさん
2009/03/11(水) 17:36:44変数が宣言されてないのが凄く違和感ある
何かオブジェクトがあった時に中身が何なのかわからないんだよね
慣れればなんとかなるもの?
0231デフォルトの名無しさん
2009/03/11(水) 17:45:05宣言は = で代入と同時に行われている
これ以外の方法で変数が宣言されることはない(配列の要素とかは別だけど)
で、変数の中身がわからなくて困るというのは、おおむね、変数名つけた人間のセンスがねえ
クラス名から類推されるオブジェクトの名前を変数に付けるのがセオリー
変数が何のオブジェクトか知りたければ、「右辺」の返り値を調べるといい
マニュアルでも、「○○を返します」というのだけは意識的に書かれてるはずだ
これまた稀にマニュアルなのに「××します」とだけ述べてて返り値のクラスについての情報がない奴がいるが、
アホ認定でよし
0232デフォルトの名無しさん
2009/03/11(水) 17:51:50何を許容し、何をおかしいとするかは言語によるでしょ
少なくとも一様ではない
複数の判断があるからこそ、Rubyでは#to_iとInteger()の二つを用意してあるんでは?
Cのatoiは0を返す
JavaのInteger#parseIntは例外を投げる
Common Lispのparse-integerはデフォルトでエラーを通知するが、
:junk-allowedパラメータによっては多少の不正形式も許容し、それでもダメならnilを返す
0233デフォルトの名無しさん
2009/03/11(水) 18:01:31いや to_i と Integer() には関連性はないから
0234デフォルトの名無しさん
2009/03/11(水) 18:05:44FileUtils.chown(1000, 1000, testfile)
#=> /usr/lib/ruby/1.8/fileutils.rb:987:in `fu_get_gid': can't convert
Fixnum into String (TypeError)
from /usr/lib/ruby/1.8/fileutils.rb:926:in `chown'
from test.rb:6
あれ?と思って何度もドキュメントを読み直してみたんだけど、どうしても
わからなくてFileUtilsのソース読んでみたんだが、
def fu_get_gid(group) #:nodoc:
return nil unless group
if /\A\d+\z/ =~ group
ここでマッチするかを調べる前に、group = group.to_s するのを忘れていませんか?
すぐ上にdefされているfu_get_uid()はStringに変換してあるのに・・・
0235デフォルトの名無しさん
2009/03/11(水) 18:42:26右辺を見る、まず変数なのかメソッドなのかわからん
どちらにせよ何を返すのかが重要だからそれを調べるために
メソッドが定義されてる部分か変数に代入されている部分を探す
探した先でも代入されてたりして再び右辺を知る必要が生じる
しかも同じ変数を複数の用途に使ってたりするから
直前にアクセスしてるのはどこかを見つけ出して
直前を知る為に分岐で使われる変数の中身を知る必要があって
変数の中身を調べるために代入されている所から右辺を辿って
という状況が3重ぐらいにネストされてる
ってただの愚痴になっちった
俺が慣れてないせいもあるだろうし、スルーでおkです
0236デフォルトの名無しさん
2009/03/11(水) 19:30:46副作用の少ないスクリプトなら、デバッガ使うか
デバッグプリント書き込んで実行しちゃうのが手っ取り早い。
あとはその変数(オブジェクト)をレシーバにしてるメソッドから類推するとか。
これはduck typingと呼ばれる概念の延長だけど
Stringのメソッド使ってるならStringかそれに似せたオブジェクトだろう、ということ。
0237234
2009/03/11(水) 19:56:51もしかして僕がバグなんですか?
0238デフォルトの名無しさん
2009/03/11(水) 20:09:14ずっと文字列だったから
0239234
2009/03/11(水) 20:14:24ええ、ただ僕の場合はユーザID、グループIDで指定する習慣となっているので
ちょっと困ります。
FileUtils#chown のユーザIDは大丈夫なのに、グループIDだとエラーが出るので
、それを手がかりにしてソースを読んでみたのです。
初心者なもので、バグかどうかはわかりませんが、fu_get_uid() と
fu_get_gid()を比較してみると、バグなのかな?という疑問もあります。
0240デフォルトの名無しさん
2009/03/11(水) 20:20:200241234
2009/03/11(水) 20:24:29やだよ。
つかEtcとかFile#Statで得たユーザID、グループIDを
いちいちto_sでStringに変換するくらいだったら、自分でfileutils.rbを修正しちゃうね。
(自分で修正したものを/usr/libに置くのはキモいけど)
0242デフォルトの名無しさん
2009/03/11(水) 20:28:40ひとりシステムで将来的にも引き継ぎなしとかならいいけど
0243デフォルトの名無しさん
2009/03/11(水) 20:34:19module FileUtils
alias org_fu_get_gid fu_get_gid
def fu_get_gid(group)
org_fu_get_gid group.to_s
end
end
>>234も>>237もバグだと思うけど、>>241をやるぐらいなら
モンキーパッチのほうがマシ。動くかはシラネ。
0244234
2009/03/11(水) 20:43:53自分で修正!
def fu_get_gid(group) #:nodoc:
return nil unless group
group = group.to_s # fu_get_uid() にならって、この部分を追加!
if /\A\d+\z/ =~ group
then group.to_i
else Etc.getgrnam(group).gid
end
end
private_module_function :fu_get_gid
これで解決だよw
つーか、この程度のバグも報告されていないとは、実はRubyユーザって
少ないんじゃないの?ww
0245デフォルトの名無しさん
2009/03/11(水) 20:47:290246デフォルトの名無しさん
2009/03/11(水) 20:49:080247デフォルトの名無しさん
2009/03/11(水) 20:52:59そんなRuby使うのやめちゃったらいいよ
折れは使うけど
0248デフォルトの名無しさん
2009/03/11(水) 21:07:41ttp://rubyforge.org/tracker/index.php?func=detail&aid=15907&group_id=426&atid=1700
0249234
2009/03/11(水) 21:15:23そのパッチが公開されたの2007年じゃんワロタww
いつになったら適用されるんだろうね
0250デフォルトの名無しさん
2009/03/11(水) 21:31:570251234
2009/03/11(水) 21:35:44俺はたいして英語が書けない読めない喋れない聞き取れない
現役高校生だし、当然職業プログラマでもないからやめておくが・・・
0252デフォルトの名無しさん
2009/03/11(水) 21:37:42なんだが。
■ このスレッドは過去ログ倉庫に格納されています