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

Ruby 初心者スレッド Part 26

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/02/27(金) 18:38:24
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【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:58
>>149
FreeBSDだと、Pythonだからインストーラーに採用できないとかもあったりするねw
まあRubyよりライセンスが緩いから、だいぶいいんだけど・・・

そう言えば、Ruby on HSPはマダなの?
早くしないと日本でもPythonに負けそうな勢いだ
ライブラリとドキュメント早くなんとかしないとね

>>152
Pythonの方がコミュニティが優秀って事だろう
0154デフォルトの名無しさん2009/03/07(土) 21:36:18
>>153
RubyとしてはHSPに乗っかる理由がない
Tk並にGUIが分離してるなら良かったんだが
0155デフォルトの名無しさん2009/03/07(土) 21:36:44
>>153
>Ruby on HSP
HSPでRuby実装・・・?
0156デフォルトの名無しさん2009/03/07(土) 21:39:19
>>155
HSPをGUIフロントエンドとして使うという意味だろう
そんなことやってる人いないけど…
RubyとHSP間のトランスレータなら、そんなん無駄だから他のことやったほうが有意義
0157デフォルトの名無しさん2009/03/07(土) 21:53:00
>>155
>Ruby on HSP
HSP様の人気にのっかると言う意味です。
最低でも、あのくらいは頑張ってくれないと・・・
0158デフォルトの名無しさん2009/03/07(土) 21:55:15
コアとしてるユーザが違う物を比べるのか
Ruby十分人気だろ
0159デフォルトの名無しさん2009/03/07(土) 22:00:17
うん、普通に人気だと思う
業務に使われる割合が PHP よりも Perl よりも少ないというだけで、人気は普通にある
0160デフォルトの名無しさん2009/03/08(日) 00:17:13
File.mtime が Timeオブジェクトを返すのですが、これをDateオブジェクトに
変換する方法ってありますか?
0161デフォルトの名無しさん2009/03/08(日) 00:26:22
使われる分野が違うだけで、HSPより人気だと思うがw
書籍発行数だけでも、さすがにHSPより上じゃないの?
0162デフォルトの名無しさん2009/03/08(日) 00:27:08
HSPとかと比べても何の危機感ももたない。
もっと危機感煽るなら、AIRくらいにしとかないとw
0163デフォルトの名無しさん2009/03/08(日) 00:30:46
>>160
Time#yearとTime#monthとTime#dayで年月日が得られるからそれをDate.newあたりに指定するのが先決
Time#strftimeの使い方を覚えるのでもいい
0164デフォルトの名無しさん2009/03/08(日) 00:32:39
>>163
わかりました、やってみます。

さいしょ、Time#strftimeで文字列比較しようとしたのですが
ゲボゲボなのでやめました。

ありがとうございました。
0165デフォルトの名無しさん2009/03/08(日) 00:34:17
そだな
mtime = File.mtime('readme.txt')
mdate = Date.new(mtime.year, mtime.month, mtime.mday)
とするのがとりあえず初心者スレだと思う
0166デフォルトの名無しさん2009/03/08(日) 00:46:29
>>165
何度もすみません、
 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
>>166
マニュアルくらい読めよ

> Date
> 日付を扱うクラスです。

> クラスメソッド
> civil([year[, mon[, mday[, start]]]])
> new([year[, mon[, mday[, start]]]])
> 暦日付に相当する日付オブジェクトを生成します。

って引数省略時の動作書いてねええええ

Date.new とだけしたときは、Time.new が現在時刻を返すのと同様、現在の年月日の Date オブジェクトを返す
0168デフォルトの名無しさん2009/03/08(日) 01:07:16
>>167
間違ってるぞ
Date.new は Date.new(0, 0, 0) だ
今日の日付が欲しいときは Date.today を使う
なんで Time.new と同じ動作にしなかったのかは若干謎
0169デフォルトの名無しさん2009/03/08(日) 01:13:20
ありがとうございます。
納得しました。
0170デフォルトの名無しさん2009/03/08(日) 02:00:12
質問です。
Rubyは標準でデータベースを持っていたり、推奨DBがあったりしますか?
0171デフォルトの名無しさん2009/03/08(日) 03:08:56
松本教祖様がGUI否定だしなあ。インストーラ採用は絶望的でしょ。
0172デフォルトの名無しさん2009/03/08(日) 03:24:04
>>146-147
これ見たんじゃない?

Linux標準にPerlとPythonが追加 − @IT
ttp://www.atmarkit.co.jp/news/200802/20/lsb.html

Rubyなんて海外じゃ全然ダメだし、どう考えても入らないよな・・・
Pythonはインストーラーやパッケージシステムなんかにも採用されているし、もう十分標準なんだろうな
0173デフォルトの名無しさん2009/03/08(日) 07:25:33
>>171
別にGUIを否定はしてないでしょ。興味ないだけで。
0174デフォルトの名無しさん2009/03/08(日) 13:40:07
同じだろ。
0175デフォルトの名無しさん2009/03/08(日) 19:37:52
>>170
標準では付いてない。PHPやPythonとは違ってなんでも詰め込んだりしない。
本格指向ならMySQL、普通の人は軽めのSQLiteにしておけばいいと思う。

松本教祖達が興味ない分野が死んでしまうのは痛いな
広めようという気がないのだから
0176デフォルトの名無しさん2009/03/09(月) 00:07:06
>>174
無関心は、否定よりも困る。
議論の対象にもならないのだから。
0177デフォルトの名無しさん2009/03/09(月) 09:54:04
sqliteを添付しようという話は何度かあった気がするんだがね。
0178デフォルトの名無しさん2009/03/09(月) 12:53:48
>>171
標準添付の Ruby/Tk のことも思い出してあげて下さい

require 'tk'
Tk.mainloop

で窓ができるんだぞ
0179デフォルトの名無しさん2009/03/09(月) 16:40:30
ネットワーク系の勉強をしようと思ってRubyを触り始めたのですが
たとえばhttp://stock.2ch.net/test/view.so?bbs=tech(2証プログラム)
などログインが必要なところにアクセスしようと思ったらどうすればいいのでしょうか
参考になるURLなど紹介していただけるとありがたいです
0180デフォルトの名無しさん2009/03/09(月) 17:49:52
>>179
HTTPとHTMLの勉強をしてください
Rubyはそれらをほとんど抽象化しません
0181デフォルトの名無しさん2009/03/09(月) 17:55:27
>>180
ありがとうございます。
その辺勉強してきます。
0182デフォルトの名無しさん2009/03/09(月) 18:36:26
attr_accessor で定義した属性にメタ的?にアクセスするには何が早いでしょうか?
文字列とかシンボルから属性をとりだしたいってことなんですけども。

method("属性名").callでよいのかな?

↓みたいなことをやりたいのだけど。

%w(hage, mage, moge).each do|x|
 iroiroyaru(method(x + "_items").call)
end
0183デフォルトの名無しさん2009/03/09(月) 18:55:06
まあ、見たまま素直だと思う
0184デフォルトの名無しさん2009/03/09(月) 18:57:03
>>182
やろうとしてることがいまいちピンとこなくて何だけど、とりあえず
attr_accessor :foo
と
def foo
 @foo
end
def foo=(x)
 @foo = x
end
が等価。
だからObject#methodでもいいし、Object#sendでもいいし。
0185デフォルトの名無しさん2009/03/09(月) 19:01:41
>>182
ちょっと的外れだけど instance_variable_get
0186デフォルトの名無しさん2009/03/09(月) 20:03:27
%w{ foo bar baz }.each do |x|
puts obj.send(x)
end

とか
0187デフォルトの名無しさん2009/03/09(月) 20:09:51
ありがとうございます。

>>185
属性=変数の場合はそれでも十分いけますね。

>>186 >>184
実質的に、メソッドなんですね。
おお、sendで一発でいけるのか。
0188デフォルトの名無しさん2009/03/09(月) 20:24:05
実質的にも何も、属性というものはRubyにはない

def hoge; @hoge; end
def hoge=(v); @hoge=v; end

と書く代わりに

attr_accessor :hoge

と略記することができる、というだけに過ぎない
hoge はただのインスタンスメソッドで、スクリプト上全く特別扱いされない
これを特別扱いするのはマニュアルシステムのRDocくらいだ
0189デフォルトの名無しさん2009/03/09(月) 20:40:19
あれよくないよね
0190デフォルトの名無しさん2009/03/09(月) 21:18:07
>>187
attr_accessor の仕組みを知って、類似のメソッドを自分でも書くようになると
確実にスクリプトの変態度が増すぞw

面白いから module_eval とか調べてみれ
0191デフォルトの名無しさん2009/03/09(月) 21:19:10
クラスからオブジェクトを生成する時のオブジェクトを配列にしたいです。
Array等の方法で先に配列を作り、必要となる都度そこに代入するしか方法は無いのでしょうか?

普通の配列を @a = [] の様な方法で要素数を気にせず宣言するような事をしたいです。
0192デフォルトの名無しさん2009/03/09(月) 21:27:59
class MyData < Array
def <<(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
>>191
継承して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
>>192は配列を継承したクラスだけど、
>>191が欲しいのは、自分の作ったクラスインスタンスの配列なのではなかろうか。
0195デフォルトの名無しさん2009/03/09(月) 21:34:44
説明下手ですみません。例えば、
student[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:12
あーやっぱそっちか。

class Foo
 def initialize
  @@member ||= []
  @@member << self
 end
end
0197デフォルトの名無しさん2009/03/09(月) 21:37:06
for 文でも別に構わないが、 for 文は普通は使わない

students = []
100.times.do
students << Student.new
end
0198デフォルトの名無しさん2009/03/09(月) 21:38:33
・・・ごめんこっちかな?

class Foo
 def Foo.create(num)
  ary = []
  (0..num).each { ary << Foo.new }
  ary
 end
end
0199デフォルトの名無しさん2009/03/09(月) 21:41:40
>>195
作るのは>>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:06
100のStudentインスタンスを作るだけなら
students = Array.new(100) { Student.new }
0202デフォルトの名無しさん2009/03/09(月) 21:48:10
>>201
それはスレ的によくないと思う
0203デフォルトの名無しさん2009/03/10(火) 14:02:58
あるディレクトリ以下を全部消そうとして
FileUtils.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:37
>>203
system("rm -R dist/*")
0205デフォルトの名無しさん2009/03/10(火) 14:13:48
>>203
適当に Dir.chdir しろ
Dir.pwd の結果がたぶん意図しないディレクトリになってる
0206デフォルトの名無しさん2009/03/10(火) 14:19:10
ありがとうございます。
そうじゃなくて FileUtils.rm("dist/*") で全部消せないでしょうか(distは消さない)?
カレントディレクトリには間違えなくdistがあります。
0207デフォルトの名無しさん2009/03/10(火) 14:30:09
じゃあ dist の中に * というファイルが無いんだろう
0208デフォルトの名無しさん2009/03/10(火) 14:32:30
>>206
FileUtils.rm とかって単独でグロブを展開できないんじゃないの?
現にエラー見る限り * が展開されてないじゃん

Dir.glob("dist/*").each do |f|
FileUtils.rm(f)
end

とかでいけるんじゃないか。
0209デフォルトの名無しさん2009/03/10(火) 14:36:10
>>207は刺激的で意地悪な回答だと思う

マニュアル眺めれば見当つくが、引数は配列だ
>>208ではなく、Dir.glob の結果をそのまま渡せばいい
0210デフォルトの名無しさん2009/03/10(火) 14:48:25
>>207は本スレに池w
0211デフォルトの名無しさん2009/03/10(火) 19:19:38
>>207はツンデレ
0212デフォルトの名無しさん2009/03/10(火) 23:09:56
calc_a、calc_bという二つのメソッドがありどちらも
return Integer(n) で戻り値を整数にして返します。

n = (中略) * (calc_a / calc_b)

という処理をした時に (calc_a / calc_b) の時点で小数点以下が切り捨てられてしまいます。
(calc_a / calc_b) は本来 1 より大きく 2 より小さい値にしようと思っていたのですが、どうすればよいでしょうか?
0213デフォルトの名無しさん2009/03/10(火) 23:14:42
Integer(n) という時点で、何かがまずそうだと思うんだが、それはさておき。
n = (中略) * (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
>>213>>214
無事解決しました。
ありがとうございました。
0216デフォルトの名無しさん2009/03/11(水) 09:05:39
Float(10)
Integer(1.1)
これって何?キャスト???Ruby使ってて始めてみたw
to_fとかto_i使うもんだと思ってた
0217デフォルトの名無しさん2009/03/11(水) 09:07:03
ごめん、壮絶にマニュアルに載ってた。組み込み関数なのね。
to_f, to_iとの違いはなんだろ。
レシーバーをもつメソッドの違いとかなし
0218デフォルトの名無しさん2009/03/11(水) 09:13:17
>>217
http://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
>>216
ただの関数的メソッド
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
個人的には Integer() なんかの特殊処理は好きではない
素直に「そのクラスのオブジェクトへの変換メソッドのエイリアス」とだけ設定してほしかった
0221デフォルトの名無しさん2009/03/11(水) 10:20:30
表記が違えば挙動が変わるのはおかしいことじゃない。
関数側で未定義なクラスならto_i等を呼ぶから結果的にエイリアスとしても
振る舞うだけで、関数自体はエイリアスという位置づけでもないし。
0222デフォルトの名無しさん2009/03/11(水) 10:25:33
表記が違うなら振る舞いも変えておけば使い分けできて
(゚д゚)ウマー ってことじゃないの
0223デフォルトの名無しさん2009/03/11(水) 11:35:11
Integer が整ってなかったり Float が浮いてたりするように感じるのは、変換のクラスメソッドがないから
Integer.convert があってそれを Integer() 内で呼んでる、とかそういうめんどっちい構造にすべきだった
いきなり関数形式のメソッドだけ提供されても正直困る
0224デフォルトの名無しさん2009/03/11(水) 11:43:40
関数的メソッド Integer は Integer クラスとは何の関係もないんだよね
名前がたまたま同じだけの、ただの 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
&&, || と and, or だってそうだしな
優先順位が同じになったら困る人が大量発生するだろうなw
0228デフォルトの名無しさん2009/03/11(水) 17:25:54
てかこれはそもそも "a".to_i みたいなのが 0 になるのがおかしい
数字じゃありませんってエラー出せよ
0229デフォルトの名無しさん2009/03/11(水) 17:29:20
まあ、今のRubyで to_i や to_f のメソッドを作ったら例外ブロックとか例外処理引数とかつけると思う
文字列と数値の処理は変なの入れるとRubyスクリプト全体が遅くなるから嫌がられそうだが
0230デフォルトの名無しさん2009/03/11(水) 17:36:44
人のソースを解読しながらの作業なんだけど
変数が宣言されてないのが凄く違和感ある
何かオブジェクトがあった時に中身が何なのかわからないんだよね
慣れればなんとかなるもの?
0231デフォルトの名無しさん2009/03/11(水) 17:45:05
>>230
宣言は = で代入と同時に行われている
これ以外の方法で変数が宣言されることはない(配列の要素とかは別だけど)

で、変数の中身がわからなくて困るというのは、おおむね、変数名つけた人間のセンスがねえ
クラス名から類推されるオブジェクトの名前を変数に付けるのがセオリー

変数が何のオブジェクトか知りたければ、「右辺」の返り値を調べるといい
マニュアルでも、「○○を返します」というのだけは意識的に書かれてるはずだ

これまた稀にマニュアルなのに「××します」とだけ述べてて返り値のクラスについての情報がない奴がいるが、
アホ認定でよし
0232デフォルトの名無しさん2009/03/11(水) 17:51:50
>>228
何を許容し、何をおかしいとするかは言語によるでしょ
少なくとも一様ではない
複数の判断があるからこそ、Rubyでは#to_iとInteger()の二つを用意してあるんでは?

Cのatoiは0を返す
JavaのInteger#parseIntは例外を投げる
Common Lispのparse-integerはデフォルトでエラーを通知するが、
:junk-allowedパラメータによっては多少の不正形式も許容し、それでもダメならnilを返す
0233デフォルトの名無しさん2009/03/11(水) 18:01:31
>>232
いや to_i と Integer() には関連性はないから
0234デフォルトの名無しさん2009/03/11(水) 18:05:44
testfile = "/tmp/testfile"
FileUtils.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
>>231
右辺を見る、まず変数なのかメソッドなのかわからん
どちらにせよ何を返すのかが重要だからそれを調べるために
メソッドが定義されてる部分か変数に代入されている部分を探す
探した先でも代入されてたりして再び右辺を知る必要が生じる

しかも同じ変数を複数の用途に使ってたりするから
直前にアクセスしてるのはどこかを見つけ出して
直前を知る為に分岐で使われる変数の中身を知る必要があって
変数の中身を調べるために代入されている所から右辺を辿って

という状況が3重ぐらいにネストされてる
ってただの愚痴になっちった
俺が慣れてないせいもあるだろうし、スルーでおkです
0236デフォルトの名無しさん2009/03/11(水) 19:30:46
>>235
副作用の少ないスクリプトなら、デバッガ使うか
デバッグプリント書き込んで実行しちゃうのが手っ取り早い。

あとはその変数(オブジェクト)をレシーバにしてるメソッドから類推するとか。
これはduck typingと呼ばれる概念の延長だけど
Stringのメソッド使ってるならStringかそれに似せたオブジェクトだろう、ということ。
02372342009/03/11(水) 19:56:51
ちょっと無視しないでよー
もしかして僕がバグなんですか?
0238デフォルトの名無しさん2009/03/11(水) 20:09:14
数値で指定できるの初めて知った
ずっと文字列だったから
02392342009/03/11(水) 20:14:24
>>238
ええ、ただ僕の場合はユーザID、グループIDで指定する習慣となっているので
ちょっと困ります。

FileUtils#chown のユーザIDは大丈夫なのに、グループIDだとエラーが出るので
、それを手がかりにしてソースを読んでみたのです。
初心者なもので、バグかどうかはわかりませんが、fu_get_uid() と
fu_get_gid()を比較してみると、バグなのかな?という疑問もあります。
0240デフォルトの名無しさん2009/03/11(水) 20:20:20
あん、"1000" で通るだろ
02412342009/03/11(水) 20:24:29
>>240
やだよ。

つか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:19
require 'fileutil'
module 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をやるぐらいなら
モンキーパッチのほうがマシ。動くかはシラネ。
02442342009/03/11(水) 20:43:53
じゃあ /usr/lib/ruby/1.8/fileutils.rb を適当な場所にコピーして
自分で修正!

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:29
あーはいはいそうだねすごいね
0246デフォルトの名無しさん2009/03/11(水) 20:49:08
少ないけど、何か?
0247デフォルトの名無しさん2009/03/11(水) 20:52:59
>>244
そんなRuby使うのやめちゃったらいいよ
折れは使うけど
0248デフォルトの名無しさん2009/03/11(水) 21:07:41
[#15907] Patch for FileUtils#chown (specifically: FileUtils#fu_get_gid)
ttp://rubyforge.org/tracker/index.php?func=detail&aid=15907&group_id=426&atid=1700
02492342009/03/11(水) 21:15:23
>>248
そのパッチが公開されたの2007年じゃんワロタww
いつになったら適用されるんだろうね
0250デフォルトの名無しさん2009/03/11(水) 21:31:57
redmineに移行して忘れ去られていると見た。
02512342009/03/11(水) 21:35:44
じゃあ誰か報告してあげなよ。

俺はたいして英語が書けない読めない喋れない聞き取れない
現役高校生だし、当然職業プログラマでもないからやめておくが・・・
0252デフォルトの名無しさん2009/03/11(水) 21:37:42
日本語でおk
なんだが。

■ このスレッドは過去ログ倉庫に格納されています