Ruby 初心者スレッド Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001京 ◆SsSSsSsSSs
2011/02/10(木) 13:47:51★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。
関連スレや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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0083デフォルトの名無しさん
2011/02/20(日) 23:24:10.74Python に乗り換えた
0084デフォルトの名無しさん
2011/02/21(月) 08:00:25.78ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの?
# coding:utf-8 と書くとファイルは開けるけど正規表現でエラー
# coding:Windows-31Jと書くとファイル名が文字化けして開けず
0085デフォルトの名無しさん
2011/02/21(月) 08:09:36.27マジックコメントにはソースファイルの文字エンコーディングを記述する
openに渡すファイルパス名のStringオブジェクトの文字エンコーディングをUTF-8にして
マッチに使う正規表現の文字エンコーディングをWindows-31Jにすればよかんべ
Ruby1.9はぜんぶ別個にできるぞ
0086デフォルトの名無しさん
2011/02/21(月) 08:50:12.61ばらばらに指定できるぞ。
0087デフォルトの名無しさん
2011/02/21(月) 10:32:40.65>ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの?
こっちを優先して、コードはwindows-31jで書く。
ほんで、ファイル名を表す文字列はunicodeに変換してやる。
0088デフォルトの名無しさん
2011/02/21(月) 10:49:29.190089デフォルトの名無しさん
2011/02/21(月) 14:13:01.980090デフォルトの名無しさん
2011/02/21(月) 15:09:28.210091デフォルトの名無しさん
2011/02/21(月) 18:01:35.10ARGVはダメっぽい?
009284
2011/02/21(月) 20:18:15.66あと、Encoding.default_internal がよく分かりません。
指定しておくと読み込んだ内容がその文字コードに変換されるのかと思ったんですが……
0093デフォルトの名無しさん
2011/02/22(火) 00:51:00.99ちょっと遅レスだが
require 'Win32API'
rubypath = "\0"*2048
Win32API.new('kernel32', 'GetModuleFileName', %w(i p i), 'i').call(0,rubypath,rubypath.size)
rubypath.rstrip!
p rubypath
0094デフォルトの名無しさん
2011/02/22(火) 13:37:28.410095デフォルトの名無しさん
2011/02/22(火) 15:59:04.40むしろ、昔から使ってるひと向けに
0096デフォルトの名無しさん
2011/02/22(火) 16:05:11.220097デフォルトの名無しさん
2011/02/22(火) 16:30:55.980098デフォルトの名無しさん
2011/02/22(火) 16:40:10.290099デフォルトの名無しさん
2011/02/22(火) 17:26:16.31リアル中2、Ruby最年少コミッタに就任【増田(@maskin)真樹】
http://techwave.jp/archives/51599766.html
0100デフォルトの名無しさん
2011/02/22(火) 17:34:49.250101デフォルトの名無しさん
2011/02/22(火) 19:34:27.07手元にあるたのしいRubyには全く載っていませんでした
0102デフォルトの名無しさん
2011/02/22(火) 20:00:56.10とかいうようなシロモノなので結構厳しい
0103デフォルトの名無しさん
2011/02/22(火) 21:58:19.20あったらいいね
0104デフォルトの名無しさん
2011/02/22(火) 22:05:43.440105デフォルトの名無しさん
2011/02/22(火) 22:12:17.94JavaのConcurrentパッケージとか日本語訳もされてる
並列処理関連のJava本を書いてたような
0106デフォルトの名無しさん
2011/02/23(水) 00:34:22.12Doug Leaはダグリーって呼ぶのだろうか……?
0107デフォルトの名無しさん
2011/02/23(水) 00:48:35.760108デフォルトの名無しさん
2011/02/23(水) 01:54:16.68普通に英語読みしたらダグリーだけど
実は英語圏出身じゃなくて読み方が微妙に違うとか何とかあるのかい?
0109デフォルトの名無しさん
2011/02/23(水) 02:04:44.44DougはDouglas の愛称のダグなので確定として、
Leaのほうは、英語読みすればリーかな、程度だなぁ。
ま、実際彼の名のカタカナ書きはダグ・リーが一般的。
0110デフォルトの名無しさん
2011/02/23(水) 06:44:52.71「ここはRubyで書くかな」って判断する基準って何かありますか?
0111デフォルトの名無しさん
2011/02/23(水) 06:54:51.44そんなものはない
Rubyで書きにくい・動かしにくい・指定されてないから他の言語で書く
0112デフォルトの名無しさん
2011/02/23(水) 07:53:36.190113デフォルトの名無しさん
2011/02/23(水) 09:02:46.90マクロならLisp。
0114デフォルトの名無しさん
2011/02/23(水) 10:07:20.76再帰が多いならScheme
GUI扱うならJava
ライブラリ開発や、OSのAPIとか使いまくるならC
0115デフォルトの名無しさん
2011/02/23(水) 16:06:26.92attr_accessor :x, :y, :z
def setp
@x = "@x"
self.y = "self.y"
z = "z"
end
def say
print x,' ',y,' ',z
puts
end
end
本を読みながらこんなの書いて実験してみたけど・・・
@変数とself.変数って同じ挙動だから好きな方使っていいんですよね?
高度な使い方すると違うかもしれないけど、そこまで到達してないから違いがわかんない
0116デフォルトの名無しさん
2011/02/23(水) 16:55:45.56puts "this number is #{var}" => this number is 1
puts "this number is" + var => エラー
この仕様は何か意図があるんでしょうか。。
fixnumを自動でstringに変換してくれてもいいのに、って思ってしまいます。
譲って後者をエラーにするのであれば前者もエラーにすべきとも思います。
rubyistの方のどのように考えているのですか?
0117デフォルトの名無しさん
2011/02/23(水) 17:09:35.97ぶっちゃけ最初はよくわからないと思う
クラス定義の中から使うなら @変数 を使う、
クラス定義の外から使うならメソッド使う、でしばらくいっと毛
0118デフォルトの名無しさん
2011/02/23(水) 17:30:30.29var = 1
puts "this number is #{var}" # varがto_sされるのは誰が見ても明らか
puts "this number is " + var # これも明らか
other_var + var # どうだっけ
0119デフォルトの名無しさん
2011/02/23(水) 17:32:18.510120デフォルトの名無しさん
2011/02/23(水) 17:37:21.52思いっきり大前提として、「+は表示用連結記号ではない」というのをしっかり認識して欲しいと思う
puts "STRING" + var は "STRING" + var つまり "STRING".+(var) の返り値を puts に渡してるに過ぎない
表示するときに便利とかどうでもよくて、String クラスのインスタンスメソッド + の処理結果を利用している
で、String#+ の引数に String クラスのオブジェクト以外がきたとき、どうするのが本来好ましいか
・ 引数のオブジェクトの to_s メソッドを勝手に試して、自身と連結して返す ← まちがい
・ 引数のオブジェクトが文字列と全く同じ動作をする場合にのみ、自身と連結して返す ← せいかい!
ということで、自分と同じ動作をするオブジェクトである場合に限って + で連結を試す
+ の引数になるということは String オブジェクトのメソッドが動作するとみなしてもよいということ
そういう「俺 String オブジェクトのつもりで頑張りますメソッドも作ってきました」という宣言が、to_str メソッド
"#{うめこみ}" で呼ばれる うめこみ#to_s は「オブジェクトを文字列で表現するとこんな感じ」を返す
書いているうちに飽きてきたのでトス
0121デフォルトの名無しさん
2011/02/23(水) 17:42:16.67Stringオブジェクト + foo
は
"ABC#{foo}DEF"
ほど foo を文字列化する意図が明確ではないのでとりあえず例外出して止める、
+ で連結したいなら foo をなんとかして自力で文字列化しろ、というのがいちおう回答ではあるのだが
0122デフォルトの名無しさん
2011/02/23(水) 17:47:51.620123デフォルトの名無しさん
2011/02/23(水) 18:14:52.42irb(main):414:0> require 'self'
Principle of minimum surprise, by Matz
Explicit is better than implicit.
Ruby is far better than P^D
%
0124デフォルトの名無しさん
2011/02/23(水) 18:57:21.91=> 12
こうなってほしいの? 俺は嫌だ。むしろ3になって欲しい
0125デフォルトの名無しさん
2011/02/23(水) 19:02:59.66Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
0126デフォルトの名無しさん
2011/02/23(水) 22:17:06.67すでに124が書いているように、"1" + 2 が "12" になるべきか "3" になるべきかは
人によって意見が違う。
そういう、あいまいな解釈ができそうな場合はとりあえずエラーにしておき、
どちらの挙動を意図しているのかを書き手が明示するほうがいいと思う。
"1".to_i + 2
"1" + 2.to_s
またRubyではすでに "x=#{x}" のような埋め込み式が使えるから、
わざわざ "x=" + x を自動変換したいという要求は出ないと思うよ。
0127デフォルトの名無しさん
2011/02/23(水) 22:17:50.61説明が長いよ・・・初心者がそんなの読むわけないじゃん
0128デフォルトの名無しさん
2011/02/23(水) 23:39:41.73アクセサを作らずにやったら違いが解ると思う
0129デフォルトの名無しさん
2011/02/24(木) 00:30:00.56direct variable access と indirect variable access でぐぐって。
どっちを使うかはケースバイケース。
0130116
2011/02/24(木) 02:47:08.45#{うめこみ} と puts "string" + 1
を比較するのではなく、
#{うめこみ} と "string" + 1
を比較しないと駄目、というところで氷解しました。
確かに"string" + 1 だけでは何に変換すべきか分からないですね。
ただWebプログラミングの場合、
フォームから送られてきた値とか
DBから取り出した値とか
型がstrだかnumだか気にするのが面倒で
型を自動変換してくれない言語ではちょくちょくエラーになったりしますね。
まぁ予期しない型に勝手に変換して気付かぬバグが紛れ込むよりは良いのかなやっぱり。
0131デフォルトの名無しさん
2011/02/24(木) 05:12:52.74webなら普通Validator使う罠
0132デフォルトの名無しさん
2011/02/24(木) 09:03:01.87class String
alias :__old_plus__ +
def +(o)
__old_plus__(o.to_s)
end
end
こういう思いつきを簡単に試せるのが、rubyの楽しさ。
0133デフォルトの名無しさん
2011/02/24(木) 09:17:01.960134デフォルトの名無しさん
2011/02/24(木) 09:50:58.010135デフォルトの名無しさん
2011/02/24(木) 12:58:09.08file = File.open('./test.txt','r+')
file.flock(File::LOCK_EX)
sleep(10)
file.close
こんなスクリプトを書いて実行中でも、対象ファイルをcatできたのですが、これはロックに失敗しているんでしょうか?
0136デフォルトの名無しさん
2011/02/24(木) 13:00:11.370137デフォルトの名無しさん
2011/02/24(木) 14:17:12.10ロックには成功してるけど、 >>135 がロックを理解してないと思われ。
cat じゃなくてそのスクリプトを 2 個同時に動かしてみて。
で、ロックについてもっとちゃんと調べれ。
0138デフォルトの名無しさん
2011/02/24(木) 17:03:42.52flockはアドバイザリ・ロック(紳士協定)でしかなく
ファイルのアクセス権とは無関係
ファイルの入出力をも排他制御するのは強制ロックといい、OS依存の処理になる
で、どうでしょうか?
0139デフォルトの名無しさん
2011/02/24(木) 23:02:15.32>>138
なるほど。ぐぐってもrubyで強制ロックを行う方法がでてこないのですが、rubyでは提供されていないのしょうか?
flockもunixのシステムコールだということなので同様にできると考えたのですが…
0140デフォルトの名無しさん
2011/02/24(木) 23:18:12.87出来ると思うが、そもそもOS/ファイルシステムによってmandatory lockは
できたりできなかったり。
0141デフォルトの名無しさん
2011/02/24(木) 23:29:38.28ttp://homepage1.nifty.com/~tetsu/ruby/diary/0102.html
マウントオプションがいるんだな…
0142デフォルトの名無しさん
2011/02/24(木) 23:35:33.82そのUnixシステムコールflockが紳士協定なの。
0143デフォルトの名無しさん
2011/02/25(金) 00:13:54.42(man 2 flock)
0144デフォルトの名無しさん
2011/02/25(金) 02:01:01.22values_atの引数に複数のインデックスを渡しつつ
*を書かずにすむ方法はないでしょうか?
0145デフォルトの名無しさん
2011/02/25(金) 03:39:27.41Array#values_atを書き換えるしかないと思う。
Array.class_eval do
alias _orig_values_at values_at
def values_at(*args)
_orig_values_at(*args.flatten)
end
end
0146デフォルトの名無しさん
2011/02/25(金) 06:45:32.640147デフォルトの名無しさん
2011/02/27(日) 18:40:21.92uri = Addressable::URI.parse("http://hibari.2ch.net/").normalize
p uri.host
これだと「hibari.2ch.net」が返ってきますが「2ch.net」だけ返ってくるメソッドは無いのでしょうか
正規表現で頑張るしかないのでしょうか
0148デフォルトの名無しさん
2011/02/27(日) 18:46:39.76正規表現使うしかないねえ
0149デフォルトの名無しさん
2011/02/27(日) 19:05:17.09f(i)
}
をrubyで書く場合
for i in 0..array.size-1
f(array.size-1-i)
end
(array.size-1).downto(0) do |i|
f(i)
end
より一般的な書き方ってありますか?
0150デフォルトの名無しさん
2011/02/27(日) 19:24:32.410151デフォルトの名無しさん
2011/02/27(日) 19:35:05.18おお・・・それがわかりやすいですね、ありがとう
>>149元コードがバグってました(/ω\) ハズカシー
0152デフォルトの名無しさん
2011/02/27(日) 22:48:36.58each_indexはあるのにreverse_each_indexはないのか…
0153デフォルトの名無しさん
2011/02/27(日) 22:54:14.490154デフォルトの名無しさん
2011/02/28(月) 00:44:49.100155デフォルトの名無しさん
2011/02/28(月) 08:32:07.090156デフォルトの名無しさん
2011/02/28(月) 13:15:54.560157デフォルトの名無しさん
2011/02/28(月) 13:25:53.470158デフォルトの名無しさん
2011/02/28(月) 14:04:23.12gem の spec/ とかのテストディレクトリは lib/ ディレクトリのネスト具合を正確に反映させるべきすかね
一身上の都合で AAA::BBB::111 という妙に深い名前の gem ライブラリスクリプトを2個ほど作ります
lib/aaa/000.rb # require 'aaa/000' 用
lib/aaa/bbb/111.rb
lib/aaa/bbb/222.rb
bbb/ には特にファイルはありません
で、spec/ ディレクトリに 111_spec.rb を作りたいのですが
spec/aaa/bbb/111_spec.rb
spec/111_spec.rb
spec/aaa_bbb_111_spec.rb
どれが普通っぽいですか?
0159デフォルトの名無しさん
2011/02/28(月) 14:09:05.25あるけど、その手のって、たぶん実装とspecのパスが対応している
ことを仮定していると思う。
0160デフォルトの名無しさん
2011/02/28(月) 16:04:22.73まあ既存のどれかのをコピペすればいけるが
0161デフォルトの名無しさん
2011/02/28(月) 19:18:08.040162デフォルトの名無しさん
2011/02/28(月) 19:32:21.95$ irb -f
irb>"string!"
=> "string!"
irb> irb_context.return_format
=> "=> %s\n"
irb> irb_context.return_format = "%s\n"
"%s\n"
irb> "string!"
"string!"
ということで、起動後の irb の設定変更は irb_context のメソッドを通じて行う
irb_context とだけ入力するとなんかいろいろ出てくる
conf. は irb_context の別名で被る可能性が大なので irb_context. で指定するのが無難
0163デフォルトの名無しさん
2011/02/28(月) 19:42:22.14irb> irb_context.echo=false
0164デフォルトの名無しさん
2011/03/01(火) 09:21:40.09ひとまず自分で書いたコードを載せます(1.8系です)
# グローバル定数
SCRIPT_LINES__ = { __FILE__ => File.readlines(__FILE__) }
# Moduleを拡張
class Module
def const_missing(name)
const_name = name.to_s
filename, line_no = caller(0)[1].split(":") # 呼び出し元の情報
line = SCRIPT_LINES__[filename][line_no.to_i-1] # SCRIPT_LINES__よりコード行を取得=>"t = Mobi::MobiMobi::FooBar.new"
if const_name = /([:_0-9a-zA-Z]*#{name}[:_0-9a-zA-Z]*)/.match(line) # 定数部分を抽出=>"Mobi::MobiMobi::FooBar"
const_name = const_name[1]
file = const_to_path(const_name) # 自前の別メソッドによりパスを得る=>"mobi/mobi_mobi/foo_bar"
begin
require file
const = const_get(name)
rescue LoadError # 通常の定数呼び出しだった場合に備えてLoadErrorは無視
else
return const
end
end
raise NameError, "uninitialize constant #{const_name}"
end
end
# 実行
t = Mobi::MobiMobi::FooBar.new
0165164
2011/03/01(火) 09:22:26.92これは一応うまくいくのですが、デバッグコードみたいなのを使ってるのと、
$SAFEが0じゃないとSCRIPT_LINES__を使えないので、いまいちと感じています
でも他にconst_missingで"Mobi::MobiMobi::FooBar"を得る方法がわかりません。
上のコードの場合、const_missingに送られるのは:Mobiだけなので
mobi.rbやmobi/mobi_mobi.rbが存在すれば順に読み込まれてうまくいきますが、
モジュール階層のディレクトリのみであればLoadErrorで止まってしまいます。
定義済み定数と照らしながらディレクトリ階層内を走査していくほかないでしょうか。
0166164
2011/03/01(火) 09:28:25.55すいません、今すぐ確認できないんですが
これうまくいかなかったと思います。
0167デフォルトの名無しさん
2011/03/01(火) 12:19:38.92| ノ ___ヽ
/。・゚・(____ `・゜゚・。 いつでも連絡するクマー
| u( _●_)ヽ 〉
彡、 |∪| / 誰か助けるクマー
. / ヽノ . /´
.____
/ ヽ、 _ノ\
/ (○)iji(○)\ 正義がキチガイ呼ばわりされたんだぞ。
/ (__人__) \
| |::::::| | 義憤に駆られることはないのかお?
\ l;;;;;;l /l!| !
/ `ー' \ |i Rubyistとして後ろめたさはないのかお!
/ ヽ !l ヽi
( 丶- 、 しE |そ 一生後悔することになるお!
`ー、_ノ 煤@l、E ノ <
レY^V^ヽl そこのあなた!勇気を出すんだお。
____
/ \ 助けて欲しいんだお・・・
/ _ノ ヽ、_ \ 同じ釜の飯を食ったんだお・・・
/ o゚((●)) ((●))゚o \ いつも一人で居残り残業してたんだお・・・
| (__人__) | あまりの悲しさに、むせび泣いたこともあったお
\ ` ⌒´ / そんなやる夫を見捨てるのかお?
____ このままだったら一生恨むお
/ \ たとえ誰がなんと言おうと、強烈な違和感なんだお
/ _ノ ヽ、_ \ 直観がモノ言ってんだお
/ o゚⌒ ⌒゚o \ えっぇっえ〜ん。え〜ん。
| (__人__) | えっぇっえっぇっ。うっぅっぅうー。。。
\ ` ⌒´ / うええ〜ん。。。えぐっぇぐっうっうっううぅー。。。
0168デフォルトの名無しさん
2011/03/01(火) 12:21:52.190169デフォルトの名無しさん
2011/03/01(火) 12:34:54.82ム板でスレひとつしか取得してないからそうなる
0170デフォルトの名無しさん
2011/03/01(火) 12:43:13.48自衛とはいえ我ながらアホくさいとは思うんだが
0171デフォルトの名無しさん
2011/03/01(火) 14:19:51.69なんか余裕だよね。
どんな対策したの?2ch禁止令とか出したの?
なんか2chに書き込んでも駄目な気がした。
奴らが書き込むことはないんだろうね!
ましてや、メールしてくるなんてないんだろ?
もうちょっと他の手考えるわ。
こっちは必死こいて頑張ってきとんねんで
しかし、余裕の態度は気になる。
何らかの対策しやがった臭い
ま、なんにしろ、もう2chには書き込まないよ
もっと有意義なことに時間使うわ
レスあんがと
0172デフォルトの名無しさん
2011/03/01(火) 15:24:26.41マルチポストとか多い板だからな
書き込みしてからマルチだと気づいたときの虚しさったらないぞ
0173デフォルトの名無しさん
2011/03/02(水) 08:50:04.70めんどくさい
0174デフォルトの名無しさん
2011/03/02(水) 08:58:36.37メインであろうスレに一番最初に書かれてれば本物とみなしてあまり気にしないぞ
というわけで質問どうぞ
0175デフォルトの名無しさん
2011/03/02(水) 10:00:50.37今は (2**32).class が Fixnum だったら64bit、Bignumだったら32bitというふうに
判定してるんですが、もっとすまーとな方法があれば教えてください。
require 'rbconfig' してもそれらしきものはありませんでした。
0176デフォルトの名無しさん
2011/03/02(水) 10:20:39.680177デフォルトの名無しさん
2011/03/02(水) 11:37:16.30話が見えないな。どっかのマルチが出たって話を
ここに集まってきてしゃべってるのか
0178デフォルトの名無しさん
2011/03/02(水) 11:54:18.40かわいそう かわいそう
0179デフォルトの名無しさん
2011/03/02(水) 12:00:01.760180デフォルトの名無しさん
2011/03/02(水) 12:07:33.29ttp://hibari.2ch.net/test/read.cgi/tech/1295081752/255
ttp://hibari.2ch.net/test/read.cgi/tech/1200175247/933
0181デフォルトの名無しさん
2011/03/02(水) 13:07:06.82■ このスレッドは過去ログ倉庫に格納されています