Ruby 初心者スレッド ..
39:デフォルトの名無しさん
09/12/07 03:52:50
s = "aaa bbb ccc:ddd eee"
if s =~ /ccc:(\S+)/
t = $1
s.gsub!(/ccc:(\S+)/, "") # この二度手間な記述をもっと簡潔に書くやり方はないですか?
end
p s # "aaa bbb eee"
p t # "ddd"
40:デフォルトの名無しさん
09/12/07 05:06:06
こう?
s = "aaa bbb ccc:ddd eee"
t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''
41:デフォルトの名無しさん
09/12/07 05:10:30
>>39
これくらいしか思い付かん
s = "aaa bbb ccc:ddd eee"
t = s[/ccc:(\S+)/,1]
s.gsub!(/ccc:(\S+)/,"")
又は
s,t = "aaa bbb ccc:ddd eee"
s.gsub!(/ccc:(\S+)/) { t = $1 ; "" }
もしくは
s = "aaa bbb ccc:ddd eee"
s,t = $`+$',$1 if s =~ /ccc:(\S+)/
42:デフォルトの名無しさん
09/12/07 05:12:15
>>40
ここで $1 ではなく $~[1] を使う理由はある?
43:デフォルトの名無しさん
09/12/07 10:18:05
というか特段二度手間でもない
簡潔でわかりやすくていいじゃん
44:デフォルトの名無しさん
09/12/07 11:08:35
attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?
45:デフォルトの名無しさん
09/12/07 11:16:10
>>44
そういう考え方もある
内部変数名と同じ名前のpublicなメソッドを外部提供する理由は本来無い
ユーザーに提供されるべきは、もっと一段上の名称&機能なメソッドであるべき
attr_writer :username, :password
ではなく
def user_info(h={})
@username, @password = h[:username], h[:password]
end
とかのほうがいいんじゃね、みたいな考え
オープンクラスだし堅いこと言うなJava使えJavaって感じではあるが
46:デフォルトの名無しさん
09/12/07 16:30:36
>>39
gsub!を使うということは複数回の置換が想定されるのか?
tの値は置換が起こらなければ保存しておきたいのか?
置換でも$1は得られるので
複数回の置換がおこなわれるうちの最後の$1が取れればいいだけなら
>>40 でいい
置換が起こらなければtを変更したくないのならば
t = $1 if s.gsub!(/ccc:(\S+)/, '')
とか、置換が起こらなければt=nilになってもいいのなら
t = s.gsub!(/ccc:(\S+)/, '') && $1
複数回置換のうちの最初の $1 が得たいのなら
置換が起こらなければt=nilになりますが >>41 の二番目をちょっと変えた
t = nil
s.gsub!(/ccc:(\S+)/) { t ||= $1 ; "" }
とか
t = nil
t ||= $1 while s.sub!(/ccc:(\S+)/,'') #gsub!と違って置換した結果をさらに置換していくので結果が変わることもある
とかですかね
でも、巨大文字列内の大量置換を一気にやり、なおかつ最初の$1を得たいのなら>>39が一番速いかな
>>41の最初のでもいいけど tが変更されるし>>39の方がわかりやすい
47:デフォルトの名無しさん
09/12/07 19:14:47
URLリンク(itpro.nikkeibp.co.jp)
今年はじめのこんな記事を見つけたんだけど、仕様書草案ってもうどこかで見られる?
48:デフォルトの名無しさん
09/12/07 19:19:46
RubySpecかな
49:デフォルトの名無しさん
09/12/07 19:31:48
>>47
Rubyについて Part 38
スレリンク(tech板)
261 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/12/01(火) 19:36:45
URLリンク(ruby-std.netlab.jp)
50:デフォルトの名無しさん
09/12/07 19:39:59
ddd! ありがとうございます!
51:デフォルトの名無しさん
09/12/07 21:34:59
Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか?
場合による、という結論かもしれませんが
みなさんは何を使ってますか?
52:デフォルトの名無しさん
09/12/07 21:45:45
目的によるし、おおむね目的ごとに分かれてると思う
自分で使ってテストの方向性に合うものを選択するといい
テストフレームワークを1種類しか使えない、という人は少ない
よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね
53:デフォルトの名無しさん
09/12/07 22:19:44
よーわからんがテストってあると便利そうじゃね、というレベルなら、
標準添付のtest/unitがいいんじゃね
54:デフォルトの名無しさん
09/12/07 22:34:53
テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん
55:デフォルトの名無しさん
09/12/07 22:44:51
>>52-53
アドバイスありがとうございます
そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います
56:デフォルトの名無しさん
09/12/07 22:47:08
・ 書き出し先ファイルがあれば削除
・ ファイル保存を含んだメソッドを実行
・ 例外が起こらないことをテスト
・ ファイルの中身が期待通りであることをテスト
・ 書き出し先ファイルがあれば削除
書き出すファイルを削除できないという場合は知らん
「きっと保存されるはず」みたいなテストするしかなくね
57:デフォルトの名無しさん
09/12/08 03:20:32
最終手段的には、事前にFile.openやFile#writeをフックとか・・・
58:デフォルトの名無しさん
09/12/08 11:45:06
FTPでディレクトリの更新日時が知りたいのですが取れません
一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか?
(net/ftpを利用してます)
59:デフォルトの名無しさん
09/12/08 11:55:44
MLSDとか送ればいいんじゃないの
60:デフォルトの名無しさん
09/12/08 13:17:10
>>58
一般には自力で解析するしかない。
MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。
61:デフォルトの名無しさん
09/12/08 14:02:01
>>54
class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(output, @path)
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(str, path); File.open(path, 'wb'){|f| f.print(str)}; end
end
# Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby',
# :path=> 'ruby_love.txt').publish #=> "オブジェクト指向スクリプト言語Ruby大好き!"
これの Publisher#save をテストしたいとかそんなの?
62:デフォルトの名無しさん
09/12/08 14:29:56
>>61
こう囁く
「なー、そのsaveするときの文字列がクラス本体にpとか追記せずに画面に表示できたら便利だと思わね?」
そしてこうする
class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(io, output)
end
def io
case @path
when IO, File then @path
when "$stdout", nil then $stdout
when "$stderr" then $stderr
else File.open(@path, 'wb')
end
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(io, str); io.print(str); io.close if io.kind_of?(File); end
end
Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby', :path=> $stdout).publish
これなら Publisher#save に StringIO を渡せばテストできるはず
保存時ファイル操作のエラーのときに独自処理したい場合はこれでは駄目だけど
63:デフォルトの名無しさん
09/12/08 16:17:20
JRubyとRubyの違いについて調べてみたのですが、
いまいちわからなかったのでここで質問してみます。
JRubyはコーディングの仕方が、Rubyと同じなだけであり、
それ以外の部分は全く別なものという解釈でいいのかな?
根本は全く違うものではあるが、コードレベルでは
同じ内容で動くものなので、移植する場合は、
コードのコピペでおk・・・かな?
64:デフォルトの名無しさん
09/12/08 17:29:49
>>59, 60
ありがとうございました
65:デフォルトの名無しさん
09/12/08 19:03:00
>>63
普通のRubyはCで書いてある
Cで書いてあるので拡張ライブラリはCで作るとよく動く
現在のCのバイナリはだいたい同じように動作することが期待できるのでRubyスクリプトを一度書けばどこでも動く
JRubyはJavaで書いてあるというかJavaで動くというかJava仮想マシンJVM上で動作する
Javaで書いてあるので拡張ライブラリはJavaで作ると普通に動く
おまけにJavaプログラムの一部として埋め込むことも実行することもJavaのライブラリを呼ぶこともできる
通常のRuby(Cで書かれているので区別のためにCRubyと呼ぶ)と同じように動作するように作ってあるものの
たまーに動作が違う部分が混じってることもないわけではないんだが
いちいちスクリプトレベルで対処するのも面倒だしそれこそ煩雑なので無視
本質的にはJVMのぶんだけJRubyのほうが遅い
ただ、JVMを常に起動してる場合は遜色ないか、JRubyのほうが処理が速いこともある
66:デフォルトの名無しさん
09/12/09 06:11:28
,―ヽ____、―
,/ ノ ヽ ~\
/ ノ IPA ヽ ~\
/ ノ ヽ、 `ヽ
| ノ / ̄\ / ̄~ヽ ヽ i
| ノ | ノ
\ | <●> <●> ( )
\ | | | i /
| / ヽ レ
i (●_●) /
i、 ,-―-、 ・ /
i、 <(EEEEE)> ∵/ まピョーん☆ IPA Rubyをこれからもよろしく
i、 \___/ _/
\ ,ノ
,,.....イ.ヽヽ、ー-―一ノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | ||
67:デフォルトの名無しさん
09/12/09 10:43:59
おまえら1.9.1更新しろー
URLリンク(sourceforge.jp)
と思ったがインストーラつきを公開してる人はまだいないのね
68:デフォルトの名無しさん
09/12/09 10:47:19
みんなに広まってからアップグレードする
どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし
69:デフォルトの名無しさん
09/12/09 11:01:47
>>68
安心しろ
1.9.1を普段使ってる奴は普通にアップグレードするし、
1.9.1を自分のスクリプト用のチェックにしか使ってない奴は
「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない
とっととアップグレードすれ
70:デフォルトの名無しさん
09/12/09 11:14:16
head使いには関係ないしな。
71:デフォルトの名無しさん
09/12/09 11:19:29
というか、パッチレベル0を鬱陶しいと思ってる人にこそ、
「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め
そうしないといつまでたってもだらだら残るぞ
自分のサイトに最新版へのリンクでも張っとけ
72:デフォルトの名無しさん
09/12/09 11:25:34
~/work/source/ruby-1.9.1-p243$ make uninstall
make: *** ターゲット `uninstall' を make するルールがありません. 中止.
ぬう
てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい
73:デフォルトの名無しさん
09/12/09 11:45:58
「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?
74:デフォルトの名無しさん
09/12/09 11:54:23
raise ArgumentError, "invalid argument, RTFM"
75:デフォルトの名無しさん
09/12/09 12:12:55
ArgumentError を出したなら「引数が不正です」は言う必要なくね
76:デフォルトの名無しさん
09/12/09 12:35:33
>>73
スレ違い。 このへんで聞け。
スレリンク(tech板)
77:デフォルトの名無しさん
09/12/09 12:37:03
URLを間違えた。こっちだ。
スレリンク(tech板)
78:デフォルトの名無しさん
09/12/09 12:44:01
>>73
Hashを要素にしたArrayって英語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
79:デフォルトの名無しさん
09/12/09 12:45:27
>>78
Hashを要素にしたArrayって日本語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど
80:デフォルトの名無しさん
09/12/09 12:55:43
>>78
Hashed Array
81:デフォルトの名無しさん
09/12/09 13:25:14
初心者以前の入門者の質問で申し訳ないのですが
Rubyの絵本で勉強を始めましたところ
「配列要素の代入と参照」の項のサンプルコードで躓きました。
n cats = [] = 1
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"
このサンプルの1行目で以下のようなエラーが出てしまいます
hello.rb:1: syntax error
n cats = [] = 1
^
ググりまして「syntax error」が文法だということは分かりましたが
文法はまだ「文字列表示」と「変数」と「文字列」しか学習出来ていません
本の通りに入力しただけで、この1行目について本には一切説明がないので
どのように文法が違うのかも分からない状態です
この1行目がどのような意味なのか教えていただけないでしょうか
よろしくお願いいたします
環境
CentOS 5.3
ruby 1.8.5 (2006-08-25) [x86_64-linux]
82:81
09/12/09 13:28:11
>n cats = [] = 1
>^
スペースが省略されて「^」の位置がずれてしまいました
「^」は=と1の間にあるスペース部分を指しています
83:デフォルトの名無しさん
09/12/09 13:31:59
本書くとき間違えたんだろうな
売れてないのか何なのか正誤表にはとくに載ってない
おそらくこれが正しい
n = 1
cats = []
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"
putsでは cats[1] の Tama が表示されるはず
84:デフォルトの名無しさん
09/12/09 13:38:25
質問
メソッドの中から、そのメソッドを呼び出しているメソッドの名前を知りたいのですが、
Kernel#caller以外の方法はありますか?
現在、caller が返す配列の中身に大してパターンマッチングを行って
メソッド名を切り出しているのですが、もっとよい方法がありそうな気がしまして
85:デフォルトの名無しさん
09/12/09 13:42:44
個人的には、空の配列に添え字代入のサンプルを書く本はあんまし好きじゃない
せっかくのRubyなんだからもっとコレクションとしての扱い方から見せたほうがいいと思うなあ
cats = []
cats << "Kuro"
cats << "Tama"
cats << "Mike"
cats << "Tora"
p cats
puts cats[1]
cats[1] = "Shiro"
p cats
こっちのほうがきっと驚いてもらえるぞ
「配列ってなんかざくざく入るんだね!」みたいな
86:81
09/12/09 13:43:10
>>83
ありがとうございます
無事Tamaを表示することができました。
87:デフォルトの名無しさん
09/12/09 13:58:35
>>80
うそをいうな。
88:デフォルトの名無しさん
09/12/09 14:02:07
>>87
では真実を
89:デフォルトの名無しさん
09/12/09 14:20:00
Hashed Array = Associative Array = rubyのHash
90:デフォルトの名無しさん
09/12/09 14:20:08
array of hashes じゃないの?
91:デフォルトの名無しさん
09/12/09 14:57:30
array containing hash
92:デフォルトの名無しさん
09/12/09 14:59:57
泣きながらF5連打してたらこまるので
>>84
それが普通の手段
93:デフォルトの名無しさん
09/12/09 15:03:04
>>84,92
1.8.7以降を使ってるなら、__method__で。
94:93
09/12/09 15:04:07
あ、ごめん、見間違えた。
呼び出し元を知るには、当然callerですね。
95:デフォルトの名無しさん
09/12/10 05:12:13
独習Rubyってどうよ?
96:デフォルトの名無しさん
09/12/10 08:41:52
Googったんですけどわかんなかったんで教えてくださいおながいします。
「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの
インスタンスでない」ってのはどう書けばいいでしょうか?
97:デフォルトの名無しさん
09/12/10 09:16:33
=== の否定はないから全体を !
98:デフォルトの名無しさん
09/12/10 09:20:24
> 「AはBクラスのインスタンスである」ってのは A === B って書きますが
いいえ
a.kind_of?(B)
とでも書いてください
特定クラスのインスタンスでないということをチェックしたい場合は
unless a.kind_of?(B)
と書くか、または
if !a.kind_of?(B)
と書きます
99:デフォルトの名無しさん
09/12/10 09:22:57
>>96
A === B というのはA(レシーバ)の持つ===というメソッドに引数としてBを渡すということ(A.===(B)と同じ)
メソッド===はレシーバのクラスによって意味が違う
URLリンク(www.ruby-lang.org)
Classクラス(の親クラスであるModuleクラス)の===メソッドは以下の意味
URLリンク(www.ruby-lang.org)
だから「AはBクラスのインスタンスである」を書くとするならBのメソッドなので B === A としなければならない
目的のはinstance_of?の否定かkind_of?の否定か
URLリンク(www.ruby-lang.org)
100:デフォルトの名無しさん
09/12/10 09:37:35
>>99
初心者に instance_of? を勧めるのは正直あまりお勧めしない
irb> p 12.instance_of?(Integer)
false
irb> p 12.instance_of?(Fixnum)
true
irb> p 10000000000.instance_of?(Fixnum)
false
irb> p 10000000000.instance_of?(Bignum)
true
irb> require 'uri'
irb> p URI.parse("URLリンク(example.com)").instance_of?(URI)
false
irb> p URI.parse("URLリンク(example.com)").instance_of?(URI::HTTP)
true
間違ってないけどー
動作合ってるけどー
でもー
101:96
09/12/10 09:50:45
みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。
102:デフォルトの名無しさん
09/12/10 09:52:57
=== が検索できるようになってたら罵倒されたと思う
103:デフォルトの名無しさん
09/12/10 09:53:39
>>101
いちいちスレあげんなカス!
104:デフォルトの名無しさん
09/12/10 09:57:37
>>65
分かりやすい解説ありがとうございました。
イメージがつきました。
105:デフォルトの名無しさん
09/12/10 14:00:10
>>103
うるせーバカ
106:デフォルトの名無しさん
09/12/10 16:30:19
2chブラウザ使っている人で、スレッドの位置を気にしている人はいるの?
俺は履歴とかブックマークからスレッドにたどり着いているので、板一覧とか
見ていないし、スレッドの位置も特に気にしていない。
そもそも、こういう掲示板のage/sageって自由であるべきで
他人が強制するものではないと思う。
107:デフォルトの名無しさん
09/12/10 19:27:14
aというハッシュのキーにclassがあったらその値に " button"を追加して、なかったら"button"だけ、という記述を
下記のように書いたのですが、
もうちょっといい書き方ないもんでしょうか?
[{}, {:class => "hoge"}].each do |a|
a[:class] = (a[:class] ? a[:class] + " ": "") + "button" #←ここをなんとかしたい
p a
end
108:デフォルトの名無しさん
09/12/10 19:48:10
マジレス
if a[:class]
a[:class] += ": button"
else
a[:class] = "button"
end
ネタレス
a[:class] = [a[:class], "button"].compact.join(": ")
109:デフォルトの名無しさん
09/12/10 21:16:51
デフォルト値が設定されてるとおかしなことになりそうな気が…
110:デフォルトの名無しさん
09/12/10 21:19:23
デフォルト値を設定すること自体がおかしいだろ
111:デフォルトの名無しさん
09/12/10 21:27:35
二時間近く>>108に突っ込む奴がいないわけだが
年末でいつもの人は忙しいのかw
112:デフォルトの名無しさん
09/12/10 21:53:53
デフォルト値は設定しちゃダメなの?
113:デフォルトの名無しさん
09/12/10 23:00:34
配列aとbが対等な関係にある場合に、
a.zip(b)
とするのは対称でなくて見た目が悪いと思うのですが、どう思いますか?
114:デフォルトの名無しさん
09/12/10 23:03:00
それ感じたことがある。けれど代替案が見つからない。
115:デフォルトの名無しさん
09/12/10 23:03:18
別にどうも思いませんが
まあ気になるならArrayクラスのクラスメソッドにでもしてしまうとよろし
Array.zip(a, b) みたいなのなら問題あんめえ
116:デフォルトの名無しさん
09/12/10 23:04:58
>>115
それいいね。それなら、3項間以上でもすっきりかけるね。
117:デフォルトの名無しさん
09/12/10 23:05:20
Array.zip(a, b)
みたいな形だとどう?
118:デフォルトの名無しさん
09/12/10 23:05:42
ついでにEnumeratorを返すようにしてほしいと思いませんか?
119:デフォルトの名無しさん
09/12/10 23:08:22
つーとむしろ
Enumerator.zip(a,b)
なんか変か?
120:デフォルトの名無しさん
09/12/10 23:34:04
>>107
[{}, {:class => "hoge"}].each do |a|
a[:class] &&= a[:class]+" button"
a[:class] ||= "button"
p a
end
[{}, {:class => "hoge"}].each do |a|
begin
a[:class] += " button"
rescue
a[:class] = "button"
end
p a
end
def space_add h,s
return nil if h.nil?
h.replace( h+" "+s )
end
[{}, {:class => "hoge"}].each do |a|
space_add(a[:class],"buttom") || a[:class] = "button"
p a
end
121:デフォルトの名無しさん
09/12/10 23:53:39
>>113
ですが、新しいメソッド付加するほどでもないと思っていたら困ったことに・・・
ちなみに本当にほしいものは、長いほうに合わせて
[[3, 1], [4, 2], [5, 2], [6, 2]]
です。メソッド追加しないと無理ですかね?
################################
irb(main):005:0> a = [1,2]
=> [1, 2]
irb(main):006:0> b = [3,4,5,6]
=> [3, 4, 5, 6]
irb(main):007:0> a.zip(b)
=> [[1, 3], [2, 4]]
irb(main):008:0> b.zip(a)
=> [[3, 1], [4, 2], [5, nil], [6, nil]]
122:デフォルトの名無しさん
09/12/11 00:02:14
追伸:
しかも欲しいものは配列じゃなくてEnumeratorです。
> zip(a,b).each{|e| p e}
[1,3]
[2,4]
[2,5]
[2,6]
みたいに。
123:デフォルトの名無しさん
09/12/11 00:08:32
twitterとかで、投稿時刻を HH:MM:SS ではなく、「約15分前」「約2時間前」というふうに表示してますけど、
これをやってくれるRubyのライブラリはありますか。
ついでにJavaScriptのライブラリもあるとうれしいです。
124:デフォルトの名無しさん
09/12/11 00:35:15
ありません。自分で書いてください。
(Time.now.to_i - time.to_i) を適当に加工したらできるし。
125:デフォルトの名無しさん
09/12/11 00:45:02
railsならdistance_of_time_in_words
126:デフォルトの名無しさん
09/12/11 01:57:30
>>125
>distance_of_time_in_words
Thank you very much!
>>124
F***!
127:デフォルトの名無しさん
09/12/11 06:25:36
RubyはLispの替わりで使えるのか?
128:デフォルトの名無しさん
09/12/11 07:49:58
文法が全然違うからLispのソースはまず動かないよ
129:デフォルトの名無しさん
09/12/11 08:25:43
>>126
Railsならそう言えよ。
130:デフォルトの名無しさん
09/12/11 12:04:28
>>125-126
RailsのActionPackのActionViewっぽいね。これだけ使えないのかな
131:デフォルトの名無しさん
09/12/11 12:27:45
RailsはRailsで
132:デフォルトの名無しさん
09/12/11 13:40:27
>>130
require 'active_support'
require 'action_view/helpers/date_helper'
include ActionView::Helpers::DateHelper
あー、あとI18n関係の設定がいるかな。以外と面倒かも。
133:デフォルトの名無しさん
09/12/11 13:57:40
そもそも単独で使うようにできてないからな
たった一つの処理のために本質でないファイルをウンコのごとく読まなきゃならんし割に合わん
134:デフォルトの名無しさん
09/12/11 14:46:29
>>133
「ウンコのごとく読む」っていう比喩がわかんない。
どんな風に読むことを「ウンコのごとく」って言うの?
135:デフォルトの名無しさん
09/12/11 17:58:38
>>129
Railsだと分かっていたら答えられたとでもいうのかよwwww
136:デフォルトの名無しさん
09/12/11 18:23:13
たぶんYESなんじゃないかな
137:デフォルトの名無しさん
09/12/11 19:21:02
,―ヽ____、―
,/ ノ ヽ ~\
/ ノ Ruby ヽ ~\
/ ノ ヽ、 `ヽ
| ノ / ̄\ / ̄~ヽ ヽ i
| ノ | ノ
\ | <●> <●> ( )
\ | | | i /
| / ヽ レ
i (●_●) /
i、 ,-―-、 ・ /
i、 <(EEEEE)> ∵/ 楽しいプログラミング言語はIPA Rubyだけ
i、 \___/ _/
\ ,ノ
,,.....イ.ヽヽ、ー-―一ノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | ||
138:デフォルトの名無しさん
09/12/11 21:48:40
モジュールの定義の有無を確認する方法ってありますか?
method_defined?のモジュール版みたいなのを探しているのですが・・・
139:デフォルトの名無しさん
09/12/11 21:57:29
>>138
require 'net/http'
Object.const_defined?(:Net) #=> true
Net.const_defined?(:HTTP) #=> true
140:デフォルトの名無しさん
09/12/12 23:46:17
メソッド中で変数を書き換えられる場合と書き換えられない場合の区別がいまだに分からないのですが、
X=[1,2,3]
def f X[1]=4 end
大文字(const配列?)のくせにこれは書き換え成功する。
x = 1
def g x=2 end
これはスコープ内で局所変数と解釈されて、書き換えられない。
Y=1
def h Y=2 end
これは定数書き換えが不正と解釈されて通らない。
h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
ポインタっぽいのがあると一番いいのですが・・・。
141:デフォルトの名無しさん
09/12/12 23:49:33
>>140
>X=[1,2,3]
>def f X[1]=4 end
>大文字(const配列?)のくせにこれは書き換え成功する。
前後にX.object_idを表示してみると、「同じオブジェクト」を
指したままであることが確認できるはず。
配列のような内部に状態を持つオブジェクトの状態を変更することは
定数という観点でいうと「書き換え」ではない。
>x = 1
>def g x=2 end
>これはスコープ内で局所変数と解釈されて、書き換えられない。
>h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
>ポインタっぽいのがあると一番いいのですが・・・。
オブジェクトと変数の区別を理解してから出直しておいで。
142:デフォルトの名無しさん
09/12/13 00:07:05
返信ありがとうございます。
オブジェクトと変数の区別があるのは分かりますが、
X = Integer(1)
と
Y = [1,2,3]
はどちらも
定数=「オブジェクトのインスタンス」
に見えるのですが。
143:デフォルトの名無しさん
09/12/13 00:12:11
irb(main):001:0> CONS = [0, 1, 2]
=> [0, 1, 2]
irb(main):002:0> CONS = ["A", "B", "C"]
(irb):2: warning: already initialized constant CONS
=> ["A", "B", "C"]
144:デフォルトの名無しさん
09/12/13 00:12:28
定数は参照の付け替えが出来ないだけで
参照先のオブジェクトが内部状態を変えることには関知しない
145:デフォルトの名無しさん
09/12/13 00:18:59
では
class Integer
def f
self = 8
end
end
X = Integer(3)
X.f()
p X
みたいな感じで内部状態を変えることは原理的には可能でしょうか?
146:デフォルトの名無しさん
09/12/13 00:23:02
>>145
オブジェクトと変数の区別を理解してから出直しておいで。
147:デフォルトの名無しさん
09/12/13 00:25:02
いや、もちろん
@なんとか=8
でしょうけど。
148:デフォルトの名無しさん
09/12/13 00:29:09
オブジェクトと変数の区別を理解したいので
質問を続けます。
149:デフォルトの名無しさん
09/12/13 00:29:25
>>145
Integerのような組み込みのクラスだとそれできないから、i++とかインクリメンタル演算子が実装できないんだよね・・・
150:デフォルトの名無しさん
09/12/13 00:31:32
>>149
selfを変更できるクラスはRubyにはないぞ
データ格納領域がRuby的に保護されてて触れない
151:デフォルトの名無しさん
09/12/13 00:36:43
selfはたんに気分で書いてしまったので気にしないでください。
(私のミスです)
自分で定義したクラスなら
class MyInt
def initialize(i)
@i=i
end
def ++() # 前置演算子の定義の仕方はしらないですが・・・
@i+=1
end
end
でいいわけですよね。
152:デフォルトの名無しさん
09/12/13 00:36:49
もとのxの件はオブジェクトと変数の違いではなく
ローカル変数のスコープの問題だねえ。
153:デフォルトの名無しさん
09/12/13 00:38:42
>>152
そうですね。本当はそれが知りたかったわけですが・・・。
グローバル変数にすればいいんだけど、なんか気持ち悪い。
154:デフォルトの名無しさん
09/12/13 00:41:31
なんか引数で参照渡して、それを書き換えればいいんだよ〜
みたいなのはないんでしょうか?
・・・たぶんないんでしょうね
155:デフォルトの名無しさん
09/12/13 00:44:42
引数で渡していいならArrayみたいな内部状態を持つオブジェクトに包んで
渡すくらいかね。
156:デフォルトの名無しさん
09/12/13 00:48:32
初心者なんで間違っているかもだけど、参照渡しだから引数に渡された
オブジェクト自体を書き換えることはできるよね?
def method(str) {str.gsub! /a/, '!'}
x = "katakana"
puts x #=> "katakana"
method x
puts x #=> "k!t!k!n!"
157:デフォルトの名無しさん
09/12/13 00:48:47
やっぱそれですか。
議論によって問題の所在がはっきりしてきました。
おつきあいありがとうございます。
158:デフォルトの名無しさん
09/12/13 00:51:40
>>156
それはたぶん文字の配列わたしてるですね。
159:デフォルトの名無しさん
09/12/13 00:53:10
えっ?
160:デフォルトの名無しさん
09/12/13 00:53:23
そうだ、eval使おうか(笑)!
161:156
09/12/13 00:54:39
>>158
Ruby のStringオブジェクトの内部ってArrayで表現されていたんですか?
知りませんでした。><
C言語みたいですね。
162:デフォルトの名無しさん
09/12/13 00:56:25
158ですが、私も初心者なので、フォローお願いします。
普通の言語なら文字列の扱いはそうなってるんじゃないかなぁ?
163:デフォルトの名無しさん
09/12/13 01:06:12
何の意味があるか分からない思いつきだけど通りました。
X='12'
def f
X.gsub!('12','2')
end
f()
p eval(X)
164:デフォルトの名無しさん
09/12/13 01:22:35
>>162
文字列がイミュータブル(変更不可)な言語は普通にあるよ
Pythonなんかもそう
>>> s = 'abc'
>>> s[0] = 'A'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
上のごちゃっとしたところをまとめると
* 変数はオブジェクトに付けられた矢印(あるいはラベル)。例: a = [1,2,3]
* 変数を通じてオブジェクトを操作することが出来る。例: a[0], a[1]
* Rubyの文字列はミュータブル(変更可能)なので
変数が指すオブジェクトの中身を書き換えることができる。例: a[1] = 20 # [1,20,3]
165:156
09/12/13 01:24:26
>>162
自分なりに調べてみました。
def method(obj)
obj.object_id
end
str = "katakana"
p str.object_id #=> 69877275538400
p method str #=> 69877275538400
この結果から分かりますが、上記の変数 str と obj は同一のオブジェクトを指しています。
したがって、変数 obj に対して破壊的なメソッド(オブジェクト自体を変更するメソッド)を使うと
str が指しているオブジェクトも同一ですから、objに対して行った操作が反映されている、というわけですね。
あってますか?
あと、Stringオブジェクトの内部表現については詳しくしりません。
Rubyのソースを読んでみればわかると思うのですが、まだそこまでのレベルではないので...
スレ汚し失礼しましたです。
166:164
09/12/13 01:27:10
例が文字列じゃなく配列になってた。それぞれ以下に読み替えて
例: s = '123' # sは文字列 '123' を指す
例: s[0], s[1] # sの一文字(バイト)目と二文字目を取得
例: s[1] = '5' # sの一文字目を '5' に変更
>>165
あってるお
内部表現なんて実装次第なんだから
出来ることを正確に把握するほうが大切
167:デフォルトの名無しさん
09/12/13 01:32:12
カビの生えた例だけどこんなのも貼っとく
a = [0, 1, 2]
b = a
b[1] = 10
これでaが何になるのかわからなかった人は横着しないで入門書嫁
168:140
09/12/13 08:24:28
昨日の者ですが、
結局クラスでラップする感じになるのかなぁ。
下は意図した通りに動きます。
def State(val)
Monad.new(val)
end
class Monad
def initialize(val)
@val=val
end
attr_accessor :val
end
def f(st)
st.val += 1
end
X = State 1
f(X)
p X.val
169:140
09/12/13 08:30:00
なるほどRubyって関数型言語だったのか!
170:デフォルトの名無しさん
09/12/13 08:33:09
Dir.globが探索するファイル/ディレクトリの条件って何ですか?
i=0
Dir.chdir("C:\\"){Dir.glob('**/*'){i+=1}}
p i
=>150660
dir c:\ /s /b /a|find /c /v ""
=>154483
C:\の全ファイルを選択→プロパティのファイル数+フォルダ数
=>153390
1〜2違うどころではないんだが・・・('A`)
171:デフォルトの名無しさん
09/12/13 09:22:12
>>170
DOSのコマンドを知らないから憶測だけど、
"."と".."を含めてる含めてないとか?
172:デフォルトの名無しさん
09/12/13 09:40:23
>>170
日本語ファイル名が膨らまれているとか
173:デフォルトの名無しさん
09/12/13 11:00:49
るびまのページいま停止中?
174:デフォルトの名無しさん
09/12/13 11:22:02
Ω
∅
175:デフォルトの名無しさん
09/12/13 11:44:38
p "あ"
とすると、
"\202\240"
8進数で返ってくるのでわかりにくいです。
16進数で帰ってきて欲しいのですが、どうすればいいのでしょうか?
176:デフォルトの名無しさん
09/12/13 12:05:56
String#inspect の定義を変更すれば良い。
class String; def inspect; "\""+ self.each_byte.map{|c| "\\x%02x" % c }.join + "\""; end; end
177:デフォルトの名無しさん
09/12/13 12:15:41
0x20...0x80はそのままにした方が目に優しそうだ
あと?\と?"は別扱いでとか考え出したら面倒くせええ
178:デフォルトの名無しさん
09/12/13 12:17:32
>>176
それ、他のオブジェクトをinspectするときに影響が出ちゃわない?
179:デフォルトの名無しさん
09/12/13 13:03:51
8進表記されてるのだけ、16進に直すのはどう?
class String
alias _inspect inspect
def inspect
self._inspect.gsub(/\\(\d+)/){ "\\x{%02x}" % $1.oct }
end
end
180:デフォルトの名無しさん
09/12/13 13:06:37
文字列を16進表記にする関数的メソッドを定義するべきだと思うなあ
181:デフォルトの名無しさん
09/12/13 13:40:29
直前の式の返り血が入ってる組み込み変数とかってないですか?
Rubyを関数電卓代わりに使いたいんですけど
182:デフォルトの名無しさん
09/12/13 13:44:29
>>181
irb でよければ _ だと思う
183:デフォルトの名無しさん
09/12/13 13:44:54
>>181
irb
irb> 1+2
3
irb> _ +4
7
まあ返り値ならなんでもいいんだけど
irb> Time.now
Sun Dec 13 13:40:19 +0900 2009
irb> _.year
2009
184:デフォルトの名無しさん
09/12/13 13:48:02
ありがとうございます
できればirbじゃなくても使いたいんですが無いですか
185:デフォルトの名無しさん
09/12/13 13:52:21
関数の戻り値は最後の参照みてるんだし
@かなにかに保持してくれるといいと祈り続けて早10年
186:デフォルトの名無しさん
09/12/13 14:08:15
>>179
俺もそれ考えたけど"\\1000"とかで困る
187:デフォルトの名無しさん
09/12/13 15:24:26
>>180
こうするのが一般的?
p "あ".unpack("H*")
188:デフォルトの名無しさん
09/12/13 18:12:58
PHPのcall_user_funcにあたる機能はRubyでも実現できますか?
実行時に呼び出すメソッドを切り替えたいのです。
189:デフォルトの名無しさん
09/12/13 18:15:34
>>188
send, evalなど
190:デフォルトの名無しさん
09/12/13 18:24:48
>>188
ありがとうございます。
191:デフォルトの名無しさん
09/12/13 18:25:33
間違えた…>>189でした
192:デフォルトの名無しさん
09/12/13 18:49:28
異なる文字コードの文字列を同時に出力するとかじゃない限り
適切に漢字コードを指定しておけばちゃんと日本語表示されるんじゃないの?
$KCODE = 'S'
p "あ"
> "あ"
文字じゃないバイナリ列とか表示させるときに16進文字列がいいのなら
そういう出力メソッドを作るなりすれば
193:デフォルトの名無しさん
09/12/13 19:07:54
1.9 なら encoding を文字列が持ってるからできるが、1.8 なら無理だね。
あと $KCODE は 1.9 じゃ廃止だ
194:デフォルトの名無しさん
09/12/14 01:00:47
module Hoge
def f1 end
def f2 end
・・・ってかんじでメソッドがたくさんあったときに
module_function :f1,:f2,...
って全部書くしか、外からアクセスする方法はないでしょうか?
end
195:デフォルトの名無しさん
09/12/14 01:05:21
include Hoge で f1 や f2 を取り込めるよ
196:デフォルトの名無しさん
09/12/14 01:12:46
名前空間は汚染したくないので
Hoge::f1
というアクセスだけ許したいのですが・・・
いちいち書くのは保守が面倒だと思ったので。
いま考えてるのは
module_function self.methods.join(' ') #未完成
みたいな怪しい方法です。
197:デフォルトの名無しさん
09/12/14 01:20:55
module M
def m1; "m1"; end
extend M
end
M.m1 #=> "m1"
198:デフォルトの名無しさん
09/12/14 01:22:36
どんぴしゃです!
ありがとうございます。
199:デフォルトの名無しさん
09/12/14 05:51:45
メイン関数は書いた方が良いのでしょうか?
200:デフォルトの名無しさん
09/12/14 06:07:46
>>198
リファレンスより
If used with no arguments,
subsequently defined methods become module functions.
モジュール定義の頭に module_function と引数なしで書いておけば
以後に定義するメソッドにはすべて module_function が適用される。
public, private とかと同じだよ。
201:デフォルトの名無しさん
09/12/14 06:28:54
>>199
メイン関数って
スクリプトを実行した時に処理系が最初に呼び出すメソッド、という意味?
そういう意味なら、書けない、でFA
そんな取り決めないし
202:デフォルトの名無しさん
09/12/14 07:36:02
>>199
def main() しとけばRubyがエントリポイントとして呼んでくれる、とかいうことはないよ
ただ if __FILE__ == $0 ... って常套句を使って少し似たようなことはできる
203:デフォルトの名無しさん
09/12/14 08:32:24
>>199
ruby -e 'p self'
204:デフォルトの名無しさん
09/12/14 08:53:07
俺最初なんとなくmainてメソッド書いて
if __FILE__ == $0
main
end
って書いてたな
205:デフォルトの名無しさん
09/12/14 11:18:57
>>200
これでもいいなぁ。
URLリンク(ruby-doc.org)
ですね。
初心者はドキュメントのどこを見ればいいかも分からないので、とても助かります。
206:デフォルトの名無しさん
09/12/14 11:43:32
>>199
いろんなソース読んだ限り、
Rubyではこんな感じで書いている人が多い。俺も習ってる
class Application
def initialize
end
def run
# ここにメイン処理
end
end
if __FILE__ == $0
Application.new.run
end
207:デフォルトの名無しさん
09/12/14 13:15:18
待て、$0って廃止予定じゃなかったか
208:デフォルトの名無しさん
09/12/14 13:29:31
心配なら$PROGRAM_NAMEを使っておけ。
209:デフォルトの名無しさん
09/12/14 13:30:08
あと10年は1.8使い続けるから無問題
210:デフォルトの名無しさん
09/12/14 13:33:57
まあ、$0 が動かなくなる頃にはそのスクリプト本体もどっか手入れしないと動作しないとは思う
そのときにその人に直してもらうことにして $0 は使ってもよし
$PROGRAM_NAME はバージョンによらず使えるんだっけ?
211:デフォルトの名無しさん
09/12/14 13:38:35
質問が有ります。
引数があれば引数で指定したファイルに
引数がなければ標準出力(もしくはエラー出力)に文字列を出したい場合はどのように書いたものでしょうか?
212:デフォルトの名無しさん
09/12/14 13:46:34
そのまんま if とかで書けばいいと思うよ!
213:デフォルトの名無しさん
09/12/14 13:48:20
if (ARGV[0])
$stdout = File.open ARGV[0]
end
こんな感じニカ ?
214:デフォルトの名無しさん
09/12/14 13:51:15
こんな感じか
if ARGV.length > 0
f = open(ARGV[0], "w")
else
f = $stdout
end
f.write "hello"
215:デフォルトの名無しさん
09/12/14 13:52:13
>>211
def output
if filename = ARGV[0]
File.open(filename, "w"){|f| yield f }
else
yield $stdout
end
end
output{|io| io.write "a"}
closeめんどくせえ
216:デフォルトの名無しさん
09/12/14 13:55:43
> closeめんどくせえ
うむ
$stdout.close がIOError で拒否られたときは軽く眩暈がした
217:デフォルトの名無しさん
09/12/14 17:25:48
>>211
個々のプログラムでそういうことをするより
シェルのリダイレクトやパイプを使いなさいと言いたいのだが
出力先をプログラムの引数として受け取らなければならない理由はなんだろう?
218:デフォルトの名無しさん
09/12/14 18:09:37
STDOUT にログ出力をするタイプのプログラムはたいてい引数指定
たとえば wget
219:211
09/12/14 19:36:53
>>212-215
ありがとうございます、ありがとうございます
いろいろ方法ありますね。
>>217
事の発端は、最初は標準出力に出してリダイレクト(?でしたっけ)でファイルに書いていたのですが、
ファイルには出したくないBenchmarkとかで計測した結果も表示したくなってそうすると、
どうしたものかって感じになりました。
こういう時って計測結果などはエラーに出せばいいもんですかね?エラーに出していいものかどうか。
>>218
wgetは引数でファイル指定でしたっけ
220:デフォルトの名無しさん
09/12/14 20:14:48
wget -O
221:デフォルトの名無しさん
09/12/14 20:19:22
質問です。
時間の計算するにはどのクラスを使えばいいでしょうか?
具体的には時間の差分を加算したりしたいのです。
例えば、
elapsed_time += Time.local(2008,12,14,1,50,10) - Time.local(2008,12,10,1,50,10)
のような感じ(実際にはTime.localの中身は可変)
elapsed_timeをTimeにする場合だと初期化にTime.at(0)しても Thu Jan 01 09:00:00 0900 1970 になったり、
0からの時間を考えられていないようなのです。
222:デフォルトの名無しさん
09/12/14 20:24:17
>>221
基本的には「ない」
61s が 1m1s になるような、秒数のみを表すクラスというようなのは標準では存在しない
223:デフォルトの名無しさん
09/12/14 20:25:23
>>221
Time.at(0).to_i
224:デフォルトの名無しさん
09/12/14 20:26:07
>>222
そういうことか、>>223は忘れて
225:221
09/12/14 20:35:18
ありがとうです
ないですかー。
何が困るかというと、加算した差分の時間を例えば書式で出力するときにstrftimeみたいなのを自前で書かないといけないってことですよね。
誰かそういうの作ってないか探してみたんですがどうも無いようで・・・。
active_supportとかの日付の拡張あたりでなんとかならないもんですかね。
226:デフォルトの名無しさん
09/12/14 20:49:16
time = 100000
sec = time % 60
min = (time / 60) % 60
hour = (time / (60 * 60)) % 24
day = time / (24 * 60 * 60)
puts "%dday %d:%d:%d" % [day, hour, min, sec]
こんなんでいいか?
227:221
09/12/14 21:01:02
>>226
ずばりそのまま書いてくださってありがとうさんです。
使わせていだきます。
ActiveSupport使ってもこんな感じですか。かわらないやw
time = 100000
sec = time % 60
min = (time / 1.minute) % 60
hour = (time / 1.hour) % 24
day = time / 1.day
puts "%dday %d:%d:%d" % [day, hour, min, sec]
228:デフォルトの名無しさん
09/12/14 22:30:38
二年ほど前にdevでTimeSpanというクラスが提案されたことはあるみたいだねー。
立ち消えしてるのかな、これは。
229:デフォルトの名無しさん
09/12/14 22:34:40
.NETからそのままいろんなクラスパクってくりゃいいのに
230:デフォルトの名無しさん
09/12/14 22:36:53
やだあんな使いにくいAPI
.NET好きな人はIronRuby使ったらいい
231:デフォルトの名無しさん
09/12/15 00:52:12
数値積分や微分できるようなライブラリとかってないですか?
Rubyを関数電卓代わりに使いたいんですけど
232:デフォルトの名無しさん
09/12/15 00:58:10
パッチレベル上がったのにmingwでmake通らん
233:デフォルトの名無しさん
09/12/15 01:01:41
>>231
よくわからんけど「Ruby 数値積分 微分」でぐぐってみた
URLリンク(jp.rubyist.net)
こっちは結構すごそうだぞ
URLリンク(blade.nagaokaut.ac.jp)
234:デフォルトの名無しさん
09/12/15 01:01:55
GSL(GNU Scientific Library)のRubyバインドがあるようだ。
詳しくは見ていないけど、数値積分や微分はあるみたい。
ただし、最後のリリースが約2年前というのが気掛かり。
十分枯れているのだろうけれど、新しめのRubyで動くかは不明。
ところで、本格的な数式処理なら、Maximaとか使ったほうがいいんじゃない?
235:デフォルトの名無しさん
09/12/15 01:05:33
かぶりんこ。
236:デフォルトの名無しさん
09/12/15 01:43:08
ありがとうございます
導入めんどくさそうですけど頑張ってみます
237:デフォルトの名無しさん
09/12/15 02:03:40
数値積分や微分できるような関数電卓を持っていたら、それを使う。
でなければ、カシオの計算センターとか。
自前のコードからコールしたいなら、ついでにそっちも自分で書いてしまう。
てのは、いかがでしょう。
238:デフォルトの名無しさん
09/12/15 06:35:31
>>219
> ファイルには出したくないBenchmarkとかで計測した結果も表示したくなって
標準ライブラリの Logger を使ってみるというのは?
URLリンク(jp.rubyist.net)
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5423日前に更新/233 KB
担当:undef