09/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つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す URLリンク(www.ruby-lang.org)
・FAQを一応読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2:デフォルトの名無しさん
09/02/27 18:38:55
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?
A:
プログラム作成自体の初心者なら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
「初めてのRuby」
URLリンク(www.amazon.co.jp)
以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください
「Rubyレシピブック 第2版 268の技」(初心者向け)
URLリンク(www.amazon.co.jp)
「プログラミングRuby 第2版 言語編」(初心者向け)
URLリンク(www.amazon.co.jp)
「Ruby Way 第2版」(脱初心者向け)
URLリンク(www.amazon.co.jp)
「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
URLリンク(www.amazon.co.jp)
以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません
「プログラミング言語 Ruby」(言語として深く知りたい人向け)
URLリンク(www.amazon.co.jp)
3:デフォルトの名無しさん
09/02/27 18:39:59
Ruby 公式・非公式便利サイト2009
Ruby Home Page 【公式、お役立ち度が微妙】
URLリンク(www.ruby-lang.org)
Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) 【詳しい英語版】
HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
URLリンク(elbereth-hp.hp.infoseek.co.jp)
Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
URLリンク(www.ruby-doc.org)
Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
URLリンク(jp.rubyist.net)
逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
URLリンク(www.namaraii.com)
はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
URLリンク(d.hatena.ne.jp)
RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
URLリンク(www.rubyforge.org)
GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
URLリンク(github.com)
日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
URLリンク(jp.rubyist.net)
4:デフォルトの名無しさん
09/02/27 18:42:07
関連スレ
本スレ
Rubyについて Part 34
スレリンク(tech板)
アンチスレ
Rubyについて(アンチ専用) Part003
スレリンク(tech板)
Railsスレ
【Ruby】Ruby on Rails Part6
スレリンク(php板)
Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)
Ruby 1.9 系列スレ
魁け! Ruby 1.9.X
スレリンク(tech板)
5:デフォルトの名無しさん
09/02/27 18:42:51
6:デフォルトの名無しさん
09/02/27 18:57:27
厂刀、 , ヘ _
_, -‐…‐- 、___//: : : \____/: : : : >r
_>'´: : : :_,.- " : :/弌》__: : : : : : : : : : : : : : : : : : , : : }
, イ ̄`: : : : : : : : : :¨ ‐-、 : :\⌒>、: : : : : : : _: :-: :¨: : /
. /: : : : : : : : /: :.,': : : : :: : : : : \ ∧  ̄ ̄フ : : : : : :/
/:/: : : /: : :.ハ : :ト、 \: : : : \ : :Y i| / : : : : : /
| l: : :./: : :./ハ: :{ \j\j : : ∧, j: :|. /: : : : :/ 、
| |: : :| : : ,`匕 `‐z匕 \ : : }K: j. /: : : : :/ }\
j,ハ: : |: :∧fて! イfて)'y Y: :jF'},ノ ,': : : : :/ |.: :.\
\ト、{ ハ ヒリ ヒ::リ ' j /rソ イ: : : : :.{ ト、: : ハ
. j,从 " 、 "" ム/ ,{|: : : : : ト、_______ イ: :): : :.}
ゝ、 rっ , イ,|_⌒ ハ: : : : : : : : : : : : : : : : : : : : : : : : /
>-r<_/ iト、 \ \、: : : : : : : : : : : : : : : : : : 彡イ
x<7イx公、 // \ _〉\_  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
rく // 〉::::fゝ_イ / |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ .!
∧, // /⌒i| / / i| こ、これは>>1乙じゃなくて |
{ j { { /:::::::::| ,/ / | ポニーテールなんだから. j
| | ∧∨:::::::::::レ' / ヘ, | 変な勘違いしないでよね! |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
7:デフォルトの名無しさん
09/02/28 02:18:00
関連スレ
Ruby>>>>>Java
スレリンク(tech板)
アラン・ケイも認めた!Ruby>>>>>Smalltalk
スレリンク(tech板)
Ruby最高や!
スレリンク(tech板)
愛国Ruby
スレリンク(tech板)
Rubyは難しすぎ
スレリンク(tech板)
Rubyの宿題教えてください。2限目
スレリンク(tech板)
【Perl,PHP】LLバトルロワイヤル4【Ruby,Python】
スレリンク(tech板)
Rubyにはプログラミング言語以上の価値があると思う
スレリンク(php板)
Ruby VS PHP 仁義なき戦い
スレリンク(php板)
8:デフォルトの名無しさん
09/02/28 15:31:03
スレ立て乙
9:デフォルトの名無しさん
09/02/28 18:19:12
ループ内でredoをするともう一度処理を行うと思います。
begin~endで例外が発生したら同じ処理を行いたいのでredoを入れてみたらダメでした。
この場合はcatchを使うほかないのでしょうか。
具体的にはnet/httpを使ってるのですが、たまにタイムアウトします。
タイムアウトしたとき、例えば「3回はリトライ」するみたいにしたいです。
10:デフォルトの名無しさん
09/02/28 18:30:36
そういう時は retry を使う... と思ったけど、
1.9 ではなくなったんだっけ?
11:デフォルトの名無しさん
09/02/28 18:39:07
>>10
ちょー感謝です!
オライリーのプログラミング言語Ruby(出たばっかのやつ)によると、
1.8まではretryで「繰り返しを最初から行う」ことが認められていたがダメになったということです。
例外の処理に使うぶんには1.9でもいいみたいです。
この本、まだ30ページしか読んでないのでちゃんと読まなきゃですね。
ありがとうございました!
12:デフォルトの名無しさん
09/03/01 03:01:12
attr_accessorって何て発音するんだい?
アターアクセサー?
そもそもattrって何の略だろう
13:デフォルトの名無しさん
09/03/01 03:04:28
あとりびゅーとじゃないか?
14:デフォルトの名無しさん
09/03/01 04:31:57
matz日記なんで更新されないの?
15:デフォルトの名無しさん
09/03/01 06:49:39
アトリビュートアクセッサーだな
16:デフォルトの名無しさん
09/03/01 10:13:41
propertyにしとけばよかったのにMatzもひねくれだなア
17:デフォルトの名無しさん
09/03/01 10:26:42
概念上、プロパティでは絶対にないな
attr_accessor は冗長で書きにくいが齟齬の少ない表現だと思う
18:デフォルトの名無しさん
09/03/01 10:49:37
> attr_accessor
この辺はCommon LispのCLOSが元ネタって解釈でいいのかな。
19:デフォルトの名無しさん
09/03/01 11:13:30
ある程度はびっくりでがっかりだが、プロパティだと思われるよりはマシ
プロパティのように使うこともできるだけでプロパティと呼ばれたのではたまらん
20:デフォルトの名無しさん
09/03/01 13:23:43
attributeって一般的にもコンピュータ用語的にもかなりメジャーだと思うが
21:デフォルトの名無しさん
09/03/01 13:50:40
propertyは広く汎用的に、要素って意味で使うけど、attributeは属性という意味だからオブジェクトなどの閉じた範囲の中のpropertyってイメージを持ってるんだが。
この解釈は間違ってるの?
22:デフォルトの名無しさん
09/03/01 15:03:57
要素はelementだろ
23:デフォルトの名無しさん
09/03/01 15:26:02
>>16の頭の中ではattributeというのは相当にマイナーな選択である、
ということか。
24:デフォルトの名無しさん
09/03/01 15:33:14
使ってきた言語によっては全く触れた機会がない可能性のある言葉ではある
25:デフォルトの名無しさん
09/03/01 16:30:24
日本人は用語を曖昧に使いすぎなんだよ
attributeだって本来はちゃんとした定義がある
オブジェクト指向言語以外では使われない言葉
26:デフォルトの名無しさん
09/03/01 16:46:11
XMLは?
27:デフォルトの名無しさん
09/03/01 20:23:33
DOSのファイルのリードオンリーとかの属性がアトリビュートだったなそういえば
28:デフォルトの名無しさん
09/03/01 20:59:46
普通に使われる単語だし当たり前だけどな
高校生向けの単語集には大抵載ってるように思うが
29:デフォルトの名無しさん
09/03/01 22:43:21
tar + gzip を使いたいのですが、外部コマンドに丸投げするしか
方法がないのでしょうか?
30:デフォルトの名無しさん
09/03/01 23:07:04
zlibという標準添付ライブラリがあってだな
tarに関してもRubyで圧縮できるライブラリがある。ググれ
31:デフォルトの名無しさん
09/03/01 23:17:24
>>30
べりーさんくす
32:デフォルトの名無しさん
09/03/02 00:31:29
>>28
むしろPCやってるから時々単語が分かって助かるリア高の俺
attributeも単語テストに出たかもしれない
33:デフォルトの名無しさん
09/03/02 00:45:20
誰も聞いてねーよ
34:デフォルトの名無しさん
09/03/02 01:16:13
andと&&の使い分けってちゃんとしてますか?
他言語の癖で&&ばかり使ってるけど特に問題にならないんだよね。
35:デフォルトの名無しさん
09/03/02 07:05:22
>>34
結合度の違いを考えなければならないコードはだめなコード
36:デフォルトの名無しさん
09/03/02 08:28:36
『プログラミング言語Ruby』、今まで買うつもりなかったんだけど、トークイベントの
動画見たら、買いたくなってきちゃったよ。
でもMatzはまったくといっていいほどタッチしてないんだなw
37:デフォルトの名無しさん
09/03/02 08:35:31
>>34
俺の場合、&&とandは使い分けないな。常にand
でも||とorは使い分ける
なぜなら||は以下の書き方でよく使うから
var ||= 10
38:デフォルトの名無しさん
09/03/02 09:56:02
>>36
その動画見たいからURL教えて
39:デフォルトの名無しさん
09/03/02 10:45:42
タイミング的には初めてのPython第3版を買いたい気分なんだが
ああいう厚い本は好きだ
40:デフォルトの名無しさん
09/03/02 11:28:22
>>36
>でもMatzはまったくといっていいほどタッチしてないんだなw
いや、だから買いなんだw
41:デフォルトの名無しさん
09/03/02 11:40:49
その本どうして評価高いのか分からん
言語編だけ読んだが構成が滅茶苦茶で読みづらかった
相変わらずのつまらないアメリカンジョーク連発はまだ許せるにしても
所々で出る参照ページとやらの参照先が別本のライブラリ偏だったりするのでもう1冊買わないと参照できない。
42:デフォルトの名無しさん
09/03/02 11:47:32
>>41
違う本と勘違いしてないか?
43:デフォルトの名無しさん
09/03/02 11:48:24
>>41
それは『プログラミングRuby』
URLリンク(www.amazon.co.jp)
話題に出てるのは『プログラミング言語Ruby』
URLリンク(www.amazon.co.jp)
44:デフォルトの名無しさん
09/03/02 12:12:04
プログラミング言語Rubyが出そうなときは話題になったが、出たらほとんど話題にならん。
感想の一つでもあってよさそうなもんだが、結局おまえら読んでないだろ。
45:デフォルトの名無しさん
09/03/02 12:13:04
アスキーから出てる「Ruby本」は
『オブジェクト指向スクリプト言語 Ruby』
46:デフォルトの名無しさん
09/03/02 12:15:58
Ruby自体がもう下火になりつつあるしな・・
47:デフォルトの名無しさん
09/03/02 12:30:14
みんな王道になりたいからありきたりの名前付けるのかねw
48:デフォルトの名無しさん
09/03/02 12:37:28
魔道編とかよりははるかにまし
49:デフォルトの名無しさん
09/03/02 12:57:07
>>47-48
謝れ!「オウドウとも読めるよね」とかちょっと邪なこと考えたっぽい黄道編にあやm
50:デフォルトの名無しさん
09/03/02 13:19:40
・プログラミング言語Ruby
・プログラミングRuby
・オブジェクト指向スクリプト言語Ruby
似たような名前の本が多すぎるのを何とかしてください
洋書と和書で別々に出てるというのは分かるけど、それにしてもややこしすぎる
Ruby WayとかたのしいRubyとか、もっとひねった名前を付けて欲しい
51:デフォルトの名無しさん
09/03/02 13:46:35
オライリーのやつはハチドリが表紙だから「ハチドリ本」と名付ければわかりやすいんじゃ
「オブジェクト指向スクリプト言語Ruby」は似てないだろ
52:デフォルトの名無しさん
09/03/02 14:10:49
rubyの特殊な文法でメソッドの中にメソッドを定義できるってのがありますよね。
これ実際に使う機会ってあるんですか?
53:デフォルトの名無しさん
09/03/02 14:34:54
>>52
普通はない
現象上はオブジェクトの着火メソッドを実行すると使用可能メソッドがぐーんと増えるというものだが、
そんなロボットアニメみたいなことをするくらいなら他の手段を使うことを考えるべき
54:デフォルトの名無しさん
09/03/02 14:42:35
>>53
進化コマンドかw
でもオブジェクトが拡張されるならまだしも、クラスが拡張されるのはキモイな。
55:デフォルトの名無しさん
09/03/02 14:45:20
>>53
ありがとうございます。やっぱり無いですか。
Rubyはやたら細かい機能が多いんだけどやりすぎな感のあるメソッドなんかも多いですよね。
情報過多は逆に利用者を混乱させるという
56:デフォルトの名無しさん
09/03/02 14:46:11
誰か1人が秘密のコマンドを使うと、それと同種の機体とそれの改造型全員が一気にパワーアップ
…物語的には面白いが、おおむねキモいな
シングルトンなクラスでinitializeで条件分岐するならあるいは
57:デフォルトの名無しさん
09/03/02 14:47:30
>>55
多くの人は半分くらいの機能を全く使ってない
安心しろ
58:デフォルトの名無しさん
09/03/02 14:48:44
>>55
一見無意味だと思われていたメソッドがとんでもない利便を生み出すこともある。
ごちゃごちゃと細かい道具がたくさんある言語はハカーにとっては発想が膨らんで楽しいのだよ。
59:デフォルトの名無しさん
09/03/02 15:09:59
>>55
慣れると逆にJavaScriptとかの比較的シンプルな言語でやってるときに
「なんでこんな配列・文字列操作も一発でできないんだよ」
と憤慨するようになる。
初心者にやさしいかどうかは目標にしてないようなことをMatzは公言してたはず。
つーか利用者って言ってもアプリなんかと違って仮にも情報技術を扱う人間なんだから
多少の過多ぐらいで混乱すんなw
60:デフォルトの名無しさん
09/03/02 15:15:31
まさに楽しさを追求する言語だね!
61:デフォルトの名無しさん
09/03/02 15:23:55
うぜえ
62:デフォルトの名無しさん
09/03/02 16:08:52
自分が使わない機能が存在することに文句を言っても仕方ない
だまって使わなければいいだけ
63:デフォルトの名無しさん
09/03/02 16:13:36
>>38
オラの村へ行け
64:デフォルトの名無しさん
09/03/02 18:33:03
if ってスコープ作らないんだっけ?
作らないとしたら、それはなんで?
65:デフォルトの名無しさん
09/03/02 19:14:09
難しい問題だな
たまたま制御構造として定義することに決めたからスコープを作らない、という以上の回答はないんじゃないか
○○で××だから if はスコープを作らないように決めたのです、という説明はできなさそうだ
66:デフォルトの名無しさん
09/03/02 20:34:06
説明できるだろ
if true
x = 10
else
x = 20
end
のとき困るから。
67:デフォルトの名無しさん
09/03/02 20:46:47
ブロックが標準でローカルスコープを作ることと同じくらいに困るから
68:デフォルトの名無しさん
09/03/02 21:04:26
>>66
別に困んなくね?
69:デフォルトの名無しさん
09/03/02 21:14:07
まぁ、>>66程度なら
x =
if true
10
else
20
end
だからな。例が微妙。
70:デフォルトの名無しさん
09/03/02 21:40:32
メソッドの再定義ってなにかコツとかあるんですか?
requre したライブラリのメソッドの上書きが動作しません(追加は動きます)
71:デフォルトの名無しさん
09/03/02 21:44:04
定義してるモジュールが違うとか、
実は自分の定義よりあとで動的に再定義されてるとか、
単なるtypoとか。
もちっと具体的に。
72:デフォルトの名無しさん
09/03/02 21:54:38
> 定義してるモジュールが違うとか
え~、と思ったけど心当たりがあります
# require するファイル
class B
def hoge; end
end
class C <B
end
# ---------
# 自作
class C
def mage; end # 動く
def hage; end # 動いてない
end
こんな構造になって、C.new.mage は動くんですが、C.new.hage は 元の hoge が動いてるように見えます
C クラスで使う hoge の動作を書き換えたい場合は B クラスに追加しないと駄目ですか?
73:デフォルトの名無しさん
09/03/02 21:59:14
# require するファイル
class B
def hoge; end
end
class C <B
end
# ---------
# 自作
class C
def mage; end # 動く
def hoge; end # 動いてない
end
こんな構造になって、C.new.mage は動くんですが、C.new.hoge は 元の hoge が動いてるように見えます
…が意図したい書き込みです、すいません
74:デフォルトの名無しさん
09/03/02 22:03:24
それだけ見ると問題なさそうだねー。
75:デフォルトの名無しさん
09/03/02 22:08:59
>>73
直接hoge呼んでそうなる?
class Bのメソッドから間接的に呼んでるとダメだった気はするけど。
76:デフォルトの名無しさん
09/03/02 23:02:07
> 元の hoge が動いてるように見えます
そう判断した時の実行結果を貼って見れば何か判るかも。
↓の様になると思うが。
class B
def hoge;p 1; end
end
class C <B
end
class C
def mage; p 2;end
def hoge; p 3;end
end
C.new.mage # => 2
C.new.hoge # => 3
77:デフォルトの名無しさん
09/03/02 23:06:14
requireしてるのが公開されてるブツなら名前だしたほうが早いかもね。
78:デフォルトの名無しさん
09/03/02 23:16:59
>>46
> Ruby自体がもう下火になりつつあるしな・・
下火になってるって
他の言語が盛り上がってるのですかね。。
79:デフォルトの名無しさん
09/03/02 23:19:56
>>46は、CやJavaが話題にならない程度にRubyも話題にならなくなった
というのが理解できていないのさ。
80:デフォルトの名無しさん
09/03/02 23:28:45
ホっ。勉強中なもので、僕の中では熱い言語です。
81:デフォルトの名無しさん
09/03/03 00:17:18
>>73
># 自作
>class C
「class C」を「class ::C」にしてみたらどうだろう。
つまり「class C」しているつもりが知らないうちに「class Foo::C」になっている可能性があるんじゃないか。
82:デフォルトの名無しさん
09/03/03 10:42:05
>>46 >>78
Rubyやってる前からRubyやってると、今は下火には見えんなw
このスレの賑わいもあるしな。
83:デフォルトの名無しさん
09/03/03 10:46:38
1.4とかもう死にそうだった覚えがある
84:デフォルトの名無しさん
09/03/03 10:55:42
ruby -Ke の e の部分を取得することはできる?
-K オプションが(N 以外で)指定されてることを検出したいんだけども
85:デフォルトの名無しさん
09/03/03 11:00:33
>>84
$ cat test.rb
p $-K
$ ruby test.rb
"NONE"
$ ruby -Ke test.rb
"EUC"
86:デフォルトの名無しさん
09/03/03 11:07:20
>>85
> Ruby インタプリタのコマンドライン情報を示す一連の変数があります。
> 形式は $-? で ? の部分にオプションの一文字が入ります。
うおー変態変数
せんきゅー
87:デフォルトの名無しさん
09/03/03 12:25:04
> Ruby インタプリタのコマンドライン情報を示す一連の変数があります。
> 形式は $-? で ? の部分にオプションの一文字が入ります。
5年Ruby触ってたのに知らなかった・・・
88:デフォルトの名無しさん
09/03/03 23:01:59
>>82
「Rubyやってる前からRubyやってる」って禅問答か?
89:デフォルトの名無しさん
09/03/03 23:25:12
sudoコマンドのように、指定されたユーザで操作できるライブラリが
あったらいいのにと思ったことがあるのですが、この方法は邪道ですか?
# このプログラムはroot権限で実行されます。
# 当然この操作もroot権限で実行されます。
FileUtils.mkdir("/home/foobar")
# しかし、一部の操作はある特定のユーザで実行させたい場合があります。
# 例えば:
OS.sudo("hogehoge") do
# このブロックは一般ユーザ「hogehoge」で実行されます。
FileUtils.mkdir_p("/home/hogehoge/something")
#=> '/home/hogehoge' does not exist, so that this operation may be denied.
end
90:デフォルトの名無しさん
09/03/04 05:54:30
>>89
スクリプトの中で個別に操作できるべきではありません
該当ユーザーの権限でスクリプトを起動するか、または、せめて、setuid するべきです
91:デフォルトの名無しさん
09/03/05 17:05:23
少しお聞きしたいのですが、最近このスレか前スレかどこかで
初心者がリファレンスマニュアルの読む際に気をつけることに関するレスがあったと思うのですが
覚えていらっしゃる方はいらっしゃいませんでしょうか?
確か、:: とか # についての説明があったと思います。
92:デフォルトの名無しさん
09/03/05 18:06:02
>>91
マニュアルで # がついてればインスタンスメソッド
Array#map は Array クラスのインスタンスメソッド map
Array のインスタンスに対して . でアクセスできるっていうかぶっちゃけ arr = [1,2,3] に対して arr.map の形式で書ける
マニュアルで :: で区切るのはクラス名と定数
Ruby ではクラスも定数なので原理的に クラス::クラス::定数 と クラス::クラス::クラス を区別できないが、
慣れればどうということはない
実際のスクリプトでも :: で区切って書く
マニュアルで . で区切るのはクラスメソッド
URI.parse は URI クラスのクラスメソッド parse
93:デフォルトの名無しさん
09/03/05 18:35:20
Emacs で、カーソル位置のメソッド名と適当なクラス名を自動で ChangeLog に挿入してくれる elisp があったんですが、
誰か知りませんか?
vc の ChangeLog を書くときに挿入してもらいたいなーと思うんですが
94:デフォルトの名無しさん
09/03/05 18:57:25
php でいうところの URLリンク(jp2.php.net) は ruby だと何でしょうか?
95:デフォルトの名無しさん
09/03/05 19:06:54
いちおうできたけどこれは酷いw
backtrace = begin; raise; rescue; $@; end
96:デフォルトの名無しさん
09/03/05 20:23:17
>>94
caller かな
97:94
09/03/05 21:31:01
>>95-96
phper なのでいじめられると思ったけど
親切にあざーす><
98:デフォルトの名無しさん
09/03/05 23:45:52
MacOSX 10.5.6でMacPortsからruby 1.8.7をインストールして使っています。
ruby 1.8.5と1.8.7の間での変更点についての情報は何処で確認できるでしょうか?
1.8.5で動作確認しているプログラムが1.8.7になってから動かなくなったので
おそらく何か変更がありそこがネックになっていると思うのでそこを修正したく思うので
よろしくおねがいします。
エラーメッセージは特になく一見動作しているように見えて不意に突然フリーズしてしまい
やむなくCtrl-Cで終了しています。再現性も特にないバグなので言語仕様の変化だと思います。
99:デフォルトの名無しさん
09/03/06 03:43:44
>>98
-W オプションつけて実行したらどうなるよ?
100:98
09/03/06 09:01:30
ありがとうございます、そんなオプションが有ったんですね!!
いくつかインスタンスされていない変数が見つかりました。これが原因かもしれません。
チェックしてみたいと思います
101:98
09/03/06 09:04:11
s/インスタンスされていない/イニシャライズされていない/
すいません寝起きだったので用語を間違えてしまいました....orz
102:デフォルトの名無しさん
09/03/06 10:05:10
>>92
それだ!サンクス
103:デフォルトの名無しさん
09/03/06 12:08:50
すいません、gemの1.3.1をruby setup.rb でソースからインストールしたんですが、gem自体をアンインストールするにはどうすればよいでしょうか??
104:デフォルトの名無しさん
09/03/06 12:19:41
てさぎょう
105:デフォルトの名無しさん
09/03/06 12:23:41
てか自動でアンインストールして欲しいならシステム標準のパッケージの使え
106:103
09/03/06 12:25:05
どもです。
インストールしたディレクトリと/usr/bin/gem1.8 を消しましたけど、これで大丈夫でしょうか?
107:103
09/03/06 12:25:44
>>105
そうですよね。apt-get install 使うべきでした。
108:デフォルトの名無しさん
09/03/06 12:33:29
gems のディレクトリ削除して bin/gem 消せば誤作動はしないと思う
109:109
09/03/06 12:35:47
どもです!
110:デフォルトの名無しさん
09/03/06 14:45:30
すいません、昔rubyを使った事があって久しぶりに使ってみた所
いくつか忘れてしまっている所が有るのでよろしくおねがいします。
もともと引数の無いメソッド(ここではuniq)を使うとき()っているんでしたっけ?
いま、Rubyのチュートリアルを読み返して見ているのですが
uniq.mapと()はついていません、しかし検索してみるとときどきuniq().map(){hoge}という書き方を
見かけます、どちらが推奨されているのでしょうか?
よろしくおねがいします。
111:デフォルトの名無しさん
09/03/06 14:49:44
>>110
推奨かどうかは知らないけど大抵、引数ないならつけない
112:デフォルトの名無しさん
09/03/06 15:10:16
ありがとうございます。とくに動作に影響は及ぼさないのは明らかだと思うので
つけないほうこうで行きたいと思います、ところで皆さんはrubyのバージョンがあがって
動作しないコードが出てきたときはどのように調査していますか?
以前1.8.5で作っていたコードが1.8.7で動かなくなっていて少し困っています
うえの方でも -w オプションをつけることで糸口をつかんだ方がいらっしゃるようですが
どのような方法が一般的なのかとおもいまいして参考のためによろしくおねがいします。
113:デフォルトの名無しさん
09/03/06 16:03:08
同名の変数やアクセサがあったりすると動作に影響を及ぼすこともあるかもよ。
114:デフォルトの名無しさん
09/03/06 16:05:19
最初に言うと自動検知は無理
一般的には、1.8.5 から 1.8.7 にしただけで動作しなくなるスクリプトというのはそう多くない
1.8.6 feature と 1.8.7 feature を目で見てスクリプトで使われてるのをチェックするしかないな
115:デフォルトの名無しさん
09/03/06 16:44:57
わかりました。
非常に参考になりました、ありがとう御座います。
116:デフォルトの名無しさん
09/03/06 17:15:37
>同名の変数やアクセサ
アクセサとの重複はあり得ないんじゃ?
変数とかぶるケースも変数名をselfのメソッドと同名にしたのが悪い。
これたしかwarning出るよね。
117:デフォルトの名無しさん
09/03/06 17:24:28
>>116
アクセサとの重複はありないよな。
変数とかぶるケースは、同名にするのが悪いに決まってるが、
「とくに動作に影響は及ぼさないのは明らか」という部分に対して
注意喚起してるんじゃないかね。
118:デフォルトの名無しさん
09/03/06 18:41:17
Ruby 2.0 はいつ頃でますか?
1.9.1 が出たし、1, 2 年は出ない感じ?
それとも 3 年以上?
119:デフォルトの名無しさん
09/03/06 18:43:24
>>118
Ruby2.0は基本的に出ない
稀に2.0が出るのを待ってRubyを始めようという人がいるけど、あれ間違いだから
120:デフォルトの名無しさん
09/03/06 18:50:10
>>119
> Ruby2.0は基本的に出ない
どっかで表明していたっけ?
121:デフォルトの名無しさん
09/03/06 19:06:31
そもそもRuby 1.9.5あたりでまた開発版になりそうな勢いだしなぁ
本当にこの先10年くらい2.0は出ないかもしれない
122:デフォルトの名無しさん
09/03/06 19:08:55
Rubyでメソッドの引数にメソッドポインタを渡して、それを呼び出す的なことをやりたいのですが、
どのように記述したものでしょうか?
実現したい仮想的なコード:
def hoge(method)
method.call # methodを呼び出したいつもり
end
hoge(@mage.moge)
evalで書くのもダサイし、遅い気がします・・・。
def hoge(method)
eval(method)
end
hoge("@mage.moge")
123:デフォルトの名無しさん
09/03/06 19:11:32
Ruby2.0はいつかは出るのだろうけど
まだまだ作り始めてもいないので
いったいいつごろになるのやら
さっぱりわからん
10年後くらい?
124:デフォルトの名無しさん
09/03/06 19:19:37
>>122
def hoge(method)
method.call
end
hoge(@mage.method(:moge))
125:デフォルトの名無しさん
09/03/06 19:24:05
>>124
サンクス!いけました。Methodオブジェクトがポインタ的に使えますね。
ありがとうございました。
126:デフォルトの名無しさん
09/03/06 22:41:59
2.0は開発者の前に吊されたニンジンということになっている。
127:デフォルトの名無しさん
09/03/06 22:45:35
ニンジンいらないよ
128:デフォルトの名無しさん
09/03/06 22:48:45
そんなこと言わずにどうぞ
www.rubyist.net/~matz/slides/kobe07/mgp00007.html
129:118
09/03/06 23:01:44
Ruby 2.0 の件、いろいろとありがとうございます。
人参、面白かったです。
これから Ruby をはじめようかなーと漠然と思っていたので、
互換性のない 2.0 を出るのを待とうかとも思っていましたが、
まだまだ先みたいなので 1.9 を試してみます。
130:デフォルトの名無しさん
09/03/07 00:05:25
1.9の時点で1.8とは互換性がないよ。
131:デフォルトの名無しさん
09/03/07 00:07:30
言語仕様ってもうちょっと安定しないの?
132:デフォルトの名無しさん
09/03/07 00:10:06
安定しているのが売りの言語を使ったら。
133:デフォルトの名無しさん
09/03/07 00:12:38
文句言うほど不安定だとは思わんがね
134:デフォルトの名無しさん
09/03/07 00:13:24
しかし最近のLinuxディストリを見ても、RubyではなくてPythonが
標準で入っているくらいだからな。
135:デフォルトの名無しさん
09/03/07 00:13:38
Cだったら安定してるんじゃない?
136:131
09/03/07 00:15:20
すまん、昔書いたRubyスクリプトをいま実行してみたら
たくさん文句言われてうんざりした。それだけ。
137:デフォルトの名無しさん
09/03/07 00:16:39
>>134
何勘違いしてるのか知らんけど、プログラミング言語は人気だからとか言う理由で採用したりしないから
その言語で作られたアプリケーションを動作させるためにインストールされるものばかりだから
138:デフォルトの名無しさん
09/03/07 00:19:20
1.9になると警告だけじゃなくて実際に動作しなくなるものも少なくないので
今から手直しするなら1.9での動作もついでに確認しておいた方が良い
139:デフォルトの名無しさん
09/03/07 00:20:10
>>137
知ってる。
だが実際にはほとんどがPythonで書かれていて、結果としてRubyに依存関係を
もっているパッケージがほとんどない、ってこと。
140:デフォルトの名無しさん
09/03/07 00:23:58
>>139
何勘違いしてるのか知らんけど、プログラミング言語は人気だからとか言う理由で採用したりしないから
その言語で作られたアプリケーションを動作させるためにインストールされるものばかりだから
141:デフォルトの名無しさん
09/03/07 00:51:26
>>119
それってTeXのバージョンπみたいなものか
142:デフォルトの名無しさん
09/03/07 01:14:36
まともな仕様もないものは使われません
143:デフォルトの名無しさん
09/03/07 01:21:04
>>142
何勘違いしてるのか知らんけど、プログラミング言語はまともな仕様があるからとか言う理由で採用したりしないから
144:デフォルトの名無しさん
09/03/07 01:27:30
perlの仕様ってどこかにある?
pythonはあったような気がするんだが……
145:デフォルトの名無しさん
09/03/07 02:21:36
pyは人気が高い云々というか割と最近にPOSIX標準になったと思ったが
つまりなくてはならないもの
146:デフォルトの名無しさん
09/03/07 02:42:35
>>145
ソースは?
147:デフォルトの名無しさん
09/03/07 03:15:17
ググってみたがそれっぽいのがでない
思い違いのようだ
正直すまない
148:デフォルトの名無しさん
09/03/07 06:35:40
>>89
亀レスだけど、Process::Sysで出来そう
WEBrick::Utils::su 参照 # webrick/utils.rb
あとスクリプトにsetuidしても所有者権限で実行してはくれないよ、アシカラズ
149:デフォルトの名無しさん
09/03/07 09:25:56
>>127
コウウラキ 乙
>>145
Pythonって最近のディストロのインストーラーの一部とかに使われている敬意があるんじゃなかったけ?
150:デフォルトの名無しさん
09/03/07 10:48:45
ではなぜRubyが採用されない・・・
151:デフォルトの名無しさん
09/03/07 11:58:03
RubySpecってどの程度進んでるのかね……。
URLリンク(rubyspec.org)
152:デフォルトの名無しさん
09/03/07 21:25:24
単にRubyが日本発だからでわないかと。日本語って外人から見たら全然意味わからんし。
Pythonは外人発のOOp言語だから英語でのノウハウがたまりやすかったってだけだと思う。
153:デフォルトの名無しさん
09/03/07 21:28:58
>>149
FreeBSDだと、Pythonだからインストーラーに採用できないとかもあったりするねw
まあRubyよりライセンスが緩いから、だいぶいいんだけど・・・
そう言えば、Ruby on HSPはマダなの?
早くしないと日本でもPythonに負けそうな勢いだ
ライブラリとドキュメント早くなんとかしないとね
>>152
Pythonの方がコミュニティが優秀って事だろう
154:デフォルトの名無しさん
09/03/07 21:36:18
>>153
RubyとしてはHSPに乗っかる理由がない
Tk並にGUIが分離してるなら良かったんだが
155:デフォルトの名無しさん
09/03/07 21:36:44
>>153
>Ruby on HSP
HSPでRuby実装・・・?
156:デフォルトの名無しさん
09/03/07 21:39:19
>>155
HSPをGUIフロントエンドとして使うという意味だろう
そんなことやってる人いないけど…
RubyとHSP間のトランスレータなら、そんなん無駄だから他のことやったほうが有意義
157:デフォルトの名無しさん
09/03/07 21:53:00
>>155
>Ruby on HSP
HSP様の人気にのっかると言う意味です。
最低でも、あのくらいは頑張ってくれないと・・・
158:デフォルトの名無しさん
09/03/07 21:55:15
コアとしてるユーザが違う物を比べるのか
Ruby十分人気だろ
159:デフォルトの名無しさん
09/03/07 22:00:17
うん、普通に人気だと思う
業務に使われる割合が PHP よりも Perl よりも少ないというだけで、人気は普通にある
160:デフォルトの名無しさん
09/03/08 00:17:13
File.mtime が Timeオブジェクトを返すのですが、これをDateオブジェクトに
変換する方法ってありますか?
161:デフォルトの名無しさん
09/03/08 00:26:22
使われる分野が違うだけで、HSPより人気だと思うがw
書籍発行数だけでも、さすがにHSPより上じゃないの?
162:デフォルトの名無しさん
09/03/08 00:27:08
HSPとかと比べても何の危機感ももたない。
もっと危機感煽るなら、AIRくらいにしとかないとw
163:デフォルトの名無しさん
09/03/08 00:30:46
>>160
Time#yearとTime#monthとTime#dayで年月日が得られるからそれをDate.newあたりに指定するのが先決
Time#strftimeの使い方を覚えるのでもいい
164:デフォルトの名無しさん
09/03/08 00:32:39
>>163
わかりました、やってみます。
さいしょ、Time#strftimeで文字列比較しようとしたのですが
ゲボゲボなのでやめました。
ありがとうございました。
165:デフォルトの名無しさん
09/03/08 00:34:17
そだな
mtime = File.mtime('readme.txt')
mdate = Date.new(mtime.year, mtime.month, mtime.mday)
とするのがとりあえず初心者スレだと思う
166:デフォルトの名無しさん
09/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
これは期待通りです(;_;)
167:デフォルトの名無しさん
09/03/08 01:04:01
>>166
マニュアルくらい読めよ
> Date
> 日付を扱うクラスです。
> クラスメソッド
> civil([year[, mon[, mday[, start]]]])
> new([year[, mon[, mday[, start]]]])
> 暦日付に相当する日付オブジェクトを生成します。
って引数省略時の動作書いてねええええ
Date.new とだけしたときは、Time.new が現在時刻を返すのと同様、現在の年月日の Date オブジェクトを返す
168:デフォルトの名無しさん
09/03/08 01:07:16
>>167
間違ってるぞ
Date.new は Date.new(0, 0, 0) だ
今日の日付が欲しいときは Date.today を使う
なんで Time.new と同じ動作にしなかったのかは若干謎
169:デフォルトの名無しさん
09/03/08 01:13:20
ありがとうございます。
納得しました。
170:デフォルトの名無しさん
09/03/08 02:00:12
質問です。
Rubyは標準でデータベースを持っていたり、推奨DBがあったりしますか?
171:デフォルトの名無しさん
09/03/08 03:08:56
松本教祖様がGUI否定だしなあ。インストーラ採用は絶望的でしょ。
172:デフォルトの名無しさん
09/03/08 03:24:04
>>146-147
これ見たんじゃない?
Linux標準にPerlとPythonが追加 - @IT
URLリンク(www.atmarkit.co.jp)
Rubyなんて海外じゃ全然ダメだし、どう考えても入らないよな・・・
Pythonはインストーラーやパッケージシステムなんかにも採用されているし、もう十分標準なんだろうな
173:デフォルトの名無しさん
09/03/08 07:25:33
>>171
別にGUIを否定はしてないでしょ。興味ないだけで。
174:デフォルトの名無しさん
09/03/08 13:40:07
同じだろ。
175:デフォルトの名無しさん
09/03/08 19:37:52
>>170
標準では付いてない。PHPやPythonとは違ってなんでも詰め込んだりしない。
本格指向ならMySQL、普通の人は軽めのSQLiteにしておけばいいと思う。
松本教祖達が興味ない分野が死んでしまうのは痛いな
広めようという気がないのだから
176:デフォルトの名無しさん
09/03/09 00:07:06
>>174
無関心は、否定よりも困る。
議論の対象にもならないのだから。
177:デフォルトの名無しさん
09/03/09 09:54:04
sqliteを添付しようという話は何度かあった気がするんだがね。
178:デフォルトの名無しさん
09/03/09 12:53:48
>>171
標準添付の Ruby/Tk のことも思い出してあげて下さい
require 'tk'
Tk.mainloop
で窓ができるんだぞ
179:デフォルトの名無しさん
09/03/09 16:40:30
ネットワーク系の勉強をしようと思ってRubyを触り始めたのですが
たとえばURLリンク(stock.2ch.net)(2証プログラム)
などログインが必要なところにアクセスしようと思ったらどうすればいいのでしょうか
参考になるURLなど紹介していただけるとありがたいです
180:デフォルトの名無しさん
09/03/09 17:49:52
>>179
HTTPとHTMLの勉強をしてください
Rubyはそれらをほとんど抽象化しません
181:デフォルトの名無しさん
09/03/09 17:55:27
>>180
ありがとうございます。
その辺勉強してきます。
182:デフォルトの名無しさん
09/03/09 18:36:26
attr_accessor で定義した属性にメタ的?にアクセスするには何が早いでしょうか?
文字列とかシンボルから属性をとりだしたいってことなんですけども。
method("属性名").callでよいのかな?
↓みたいなことをやりたいのだけど。
%w(hage, mage, moge).each do|x|
iroiroyaru(method(x + "_items").call)
end
183:デフォルトの名無しさん
09/03/09 18:55:06
まあ、見たまま素直だと思う
184:デフォルトの名無しさん
09/03/09 18:57:03
>>182
やろうとしてることがいまいちピンとこなくて何だけど、とりあえず
attr_accessor :foo
と
def foo
@foo
end
def foo=(x)
@foo = x
end
が等価。
だからObject#methodでもいいし、Object#sendでもいいし。
185:デフォルトの名無しさん
09/03/09 19:01:41
>>182
ちょっと的外れだけど instance_variable_get
186:デフォルトの名無しさん
09/03/09 20:03:27
%w{ foo bar baz }.each do |x|
puts obj.send(x)
end
とか
187:デフォルトの名無しさん
09/03/09 20:09:51
ありがとうございます。
>>185
属性=変数の場合はそれでも十分いけますね。
>>186 >>184
実質的に、メソッドなんですね。
おお、sendで一発でいけるのか。
188:デフォルトの名無しさん
09/03/09 20:24:05
実質的にも何も、属性というものはRubyにはない
def hoge; @hoge; end
def hoge=(v); @hoge=v; end
と書く代わりに
attr_accessor :hoge
と略記することができる、というだけに過ぎない
hoge はただのインスタンスメソッドで、スクリプト上全く特別扱いされない
これを特別扱いするのはマニュアルシステムのRDocくらいだ
189:デフォルトの名無しさん
09/03/09 20:40:19
あれよくないよね
190:デフォルトの名無しさん
09/03/09 21:18:07
>>187
attr_accessor の仕組みを知って、類似のメソッドを自分でも書くようになると
確実にスクリプトの変態度が増すぞw
面白いから module_eval とか調べてみれ
191:デフォルトの名無しさん
09/03/09 21:19:10
クラスからオブジェクトを生成する時のオブジェクトを配列にしたいです。
Array等の方法で先に配列を作り、必要となる都度そこに代入するしか方法は無いのでしょうか?
普通の配列を @a = [] の様な方法で要素数を気にせず宣言するような事をしたいです。
192:デフォルトの名無しさん
09/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"]
こんなん?
委譲するべきだけど、最初は小難しいだけだから配列を継承するのが簡単
193:デフォルトの名無しさん
09/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そのままなら要素数の宣言はいらない。
194:デフォルトの名無しさん
09/03/09 21:33:27
>>192は配列を継承したクラスだけど、
>>191が欲しいのは、自分の作ったクラスインスタンスの配列なのではなかろうか。
195:デフォルトの名無しさん
09/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文なりでやるしかないのでしょうか?
196:デフォルトの名無しさん
09/03/09 21:36:12
あーやっぱそっちか。
class Foo
def initialize
@@member ||= []
@@member << self
end
end
197:デフォルトの名無しさん
09/03/09 21:37:06
for 文でも別に構わないが、 for 文は普通は使わない
students = []
100.times.do
students << Student.new
end
198:デフォルトの名無しさん
09/03/09 21:38:33
・・・ごめんこっちかな?
class Foo
def Foo.create(num)
ary = []
(0..num).each { ary << Foo.new }
ary
end
end
199:デフォルトの名無しさん
09/03/09 21:41:40
>>195
作るのは>>197
配列要素各々のオブジェクトにメソッドを実行してほしい場合は単にそのように書く
students.each do |student|
puts "数学の成績は #{student.math} です"
puts "英語の成績は #{student.english} です"
puts "国語の成績は #{student.japanese} です"
end
というか、Rubyについての基礎知識が全く無いように見受けられる
本か何かで体系的な学習をしてから動くことをお勧め
200:デフォルトの名無しさん
09/03/09 21:45:08
ありがとうございます。
まだわからない部分があってなるほど!とは思えませんが、自分で調べてみます。
最初に上手く説明できずすみませんでした。
ありがとうございました。
201:デフォルトの名無しさん
09/03/09 21:46:06
100のStudentインスタンスを作るだけなら
students = Array.new(100) { Student.new }
202:デフォルトの名無しさん
09/03/09 21:48:10
>>201
それはスレ的によくないと思う
203:デフォルトの名無しさん
09/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)
と言われます。
本当はどうすればいいのでしょうか?
204:デフォルトの名無しさん
09/03/10 14:07:37
>>203
system("rm -R dist/*")
205:デフォルトの名無しさん
09/03/10 14:13:48
>>203
適当に Dir.chdir しろ
Dir.pwd の結果がたぶん意図しないディレクトリになってる
206:デフォルトの名無しさん
09/03/10 14:19:10
ありがとうございます。
そうじゃなくて FileUtils.rm("dist/*") で全部消せないでしょうか(distは消さない)?
カレントディレクトリには間違えなくdistがあります。
207:デフォルトの名無しさん
09/03/10 14:30:09
じゃあ dist の中に * というファイルが無いんだろう
208:デフォルトの名無しさん
09/03/10 14:32:30
>>206
FileUtils.rm とかって単独でグロブを展開できないんじゃないの?
現にエラー見る限り * が展開されてないじゃん
Dir.glob("dist/*").each do |f|
FileUtils.rm(f)
end
とかでいけるんじゃないか。
209:デフォルトの名無しさん
09/03/10 14:36:10
>>207は刺激的で意地悪な回答だと思う
マニュアル眺めれば見当つくが、引数は配列だ
>>208ではなく、Dir.glob の結果をそのまま渡せばいい
210:デフォルトの名無しさん
09/03/10 14:48:25
>>207は本スレに池w
211:デフォルトの名無しさん
09/03/10 19:19:38
>>207はツンデレ
212:デフォルトの名無しさん
09/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 より小さい値にしようと思っていたのですが、どうすればよいでしょうか?
213:デフォルトの名無しさん
09/03/10 23:14:42
Integer(n) という時点で、何かがまずそうだと思うんだが、それはさておき。
n = (中略) * (calc_a.to_f / calc_b)
でいいんじゃね。
214:デフォルトの名無しさん
09/03/10 23:18:23
少しはマニュアル読めよ
…特に書いてねえええ
整数のメソッドの返り値は整数になってる
小数つきの値を返して欲しいなら小数つき数字のクラスの割り算メソッド使え
irb> 10 / 3
3
irb> Float(10) / 3
3.33333333333333
215:デフォルトの名無しさん
09/03/10 23:46:26
>>213>>214
無事解決しました。
ありがとうございました。
216:デフォルトの名無しさん
09/03/11 09:05:39
Float(10)
Integer(1.1)
これって何?キャスト???Ruby使ってて始めてみたw
to_fとかto_i使うもんだと思ってた
217:デフォルトの名無しさん
09/03/11 09:07:03
ごめん、壮絶にマニュアルに載ってた。組み込み関数なのね。
to_f, to_iとの違いはなんだろ。
レシーバーをもつメソッドの違いとかなし
218:デフォルトの名無しさん
09/03/11 09:13:17
>>217
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-lang.org)
219:デフォルトの名無しさん
09/03/11 09:14:43
>>216
ただの関数的メソッド
URI('URLリンク(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"
220:デフォルトの名無しさん
09/03/11 09:26:53
個人的には Integer() なんかの特殊処理は好きではない
素直に「そのクラスのオブジェクトへの変換メソッドのエイリアス」とだけ設定してほしかった
221:デフォルトの名無しさん
09/03/11 10:20:30
表記が違えば挙動が変わるのはおかしいことじゃない。
関数側で未定義なクラスならto_i等を呼ぶから結果的にエイリアスとしても
振る舞うだけで、関数自体はエイリアスという位置づけでもないし。
222:デフォルトの名無しさん
09/03/11 10:25:33
表記が違うなら振る舞いも変えておけば使い分けできて
(゚д゚)ウマー ってことじゃないの
223:デフォルトの名無しさん
09/03/11 11:35:11
Integer が整ってなかったり Float が浮いてたりするように感じるのは、変換のクラスメソッドがないから
Integer.convert があってそれを Integer() 内で呼んでる、とかそういうめんどっちい構造にすべきだった
いきなり関数形式のメソッドだけ提供されても正直困る
224:デフォルトの名無しさん
09/03/11 11:43:40
関数的メソッド Integer は Integer クラスとは何の関係もないんだよね
名前がたまたま同じだけの、ただの Kernel クラスのメソッド
URI() の定義を初めて見たときは激しくがっかりしたことを覚えている
クラスそのもののオブジェクトに引数を渡す方法があるのかとかちょっと期待してた俺
225:デフォルトの名無しさん
09/03/11 16:24:02
割とがっかりする仕様をそのままにしとくのもなんだかなあ感はあるね。
まあ教祖が放置してるぐらいだから、信者の皆さんに不満は無いのだろうけど。
226:デフォルトの名無しさん
09/03/11 16:35:53
個人的には、微妙に挙動の違う記法を
いくつか用意する方針には納得している
do endとブレース、Procとlambdaみたいなのは、使ってて確かに両方必要だと感じるので
ってかどうせ、変えたら変えたでまた批判されるでしょ?
227:デフォルトの名無しさん
09/03/11 16:51:39
&&, || と and, or だってそうだしな
優先順位が同じになったら困る人が大量発生するだろうなw
228:デフォルトの名無しさん
09/03/11 17:25:54
てかこれはそもそも "a".to_i みたいなのが 0 になるのがおかしい
数字じゃありませんってエラー出せよ
229:デフォルトの名無しさん
09/03/11 17:29:20
まあ、今のRubyで to_i や to_f のメソッドを作ったら例外ブロックとか例外処理引数とかつけると思う
文字列と数値の処理は変なの入れるとRubyスクリプト全体が遅くなるから嫌がられそうだが
230:デフォルトの名無しさん
09/03/11 17:36:44
人のソースを解読しながらの作業なんだけど
変数が宣言されてないのが凄く違和感ある
何かオブジェクトがあった時に中身が何なのかわからないんだよね
慣れればなんとかなるもの?
231:デフォルトの名無しさん
09/03/11 17:45:05
>>230
宣言は = で代入と同時に行われている
これ以外の方法で変数が宣言されることはない(配列の要素とかは別だけど)
で、変数の中身がわからなくて困るというのは、おおむね、変数名つけた人間のセンスがねえ
クラス名から類推されるオブジェクトの名前を変数に付けるのがセオリー
変数が何のオブジェクトか知りたければ、「右辺」の返り値を調べるといい
マニュアルでも、「○○を返します」というのだけは意識的に書かれてるはずだ
これまた稀にマニュアルなのに「××します」とだけ述べてて返り値のクラスについての情報がない奴がいるが、
アホ認定でよし
232:デフォルトの名無しさん
09/03/11 17:51:50
>>228
何を許容し、何をおかしいとするかは言語によるでしょ
少なくとも一様ではない
複数の判断があるからこそ、Rubyでは#to_iとInteger()の二つを用意してあるんでは?
Cのatoiは0を返す
JavaのInteger#parseIntは例外を投げる
Common Lispのparse-integerはデフォルトでエラーを通知するが、
:junk-allowedパラメータによっては多少の不正形式も許容し、それでもダメならnilを返す
233:デフォルトの名無しさん
09/03/11 18:01:31
>>232
いや to_i と Integer() には関連性はないから
234:デフォルトの名無しさん
09/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に変換してあるのに・・・
235:デフォルトの名無しさん
09/03/11 18:42:26
>>231
右辺を見る、まず変数なのかメソッドなのかわからん
どちらにせよ何を返すのかが重要だからそれを調べるために
メソッドが定義されてる部分か変数に代入されている部分を探す
探した先でも代入されてたりして再び右辺を知る必要が生じる
しかも同じ変数を複数の用途に使ってたりするから
直前にアクセスしてるのはどこかを見つけ出して
直前を知る為に分岐で使われる変数の中身を知る必要があって
変数の中身を調べるために代入されている所から右辺を辿って
という状況が3重ぐらいにネストされてる
ってただの愚痴になっちった
俺が慣れてないせいもあるだろうし、スルーでおkです
236:デフォルトの名無しさん
09/03/11 19:30:46
>>235
副作用の少ないスクリプトなら、デバッガ使うか
デバッグプリント書き込んで実行しちゃうのが手っ取り早い。
あとはその変数(オブジェクト)をレシーバにしてるメソッドから類推するとか。
これはduck typingと呼ばれる概念の延長だけど
Stringのメソッド使ってるならStringかそれに似せたオブジェクトだろう、ということ。
237:234
09/03/11 19:56:51
ちょっと無視しないでよー
もしかして僕がバグなんですか?
238:デフォルトの名無しさん
09/03/11 20:09:14
数値で指定できるの初めて知った
ずっと文字列だったから
239:234
09/03/11 20:14:24
>>238
ええ、ただ僕の場合はユーザID、グループIDで指定する習慣となっているので
ちょっと困ります。
FileUtils#chown のユーザIDは大丈夫なのに、グループIDだとエラーが出るので
、それを手がかりにしてソースを読んでみたのです。
初心者なもので、バグかどうかはわかりませんが、fu_get_uid() と
fu_get_gid()を比較してみると、バグなのかな?という疑問もあります。
240:デフォルトの名無しさん
09/03/11 20:20:20
あん、"1000" で通るだろ
241:234
09/03/11 20:24:29
>>240
やだよ。
つかEtcとかFile#Statで得たユーザID、グループIDを
いちいちto_sでStringに変換するくらいだったら、自分でfileutils.rbを修正しちゃうね。
(自分で修正したものを/usr/libに置くのはキモいけど)
242:デフォルトの名無しさん
09/03/11 20:28:40
そういうことをやると、環境構築のたびそこに修正が入るわけだが
ひとりシステムで将来的にも引き継ぎなしとかならいいけど
243:デフォルトの名無しさん
09/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をやるぐらいなら
モンキーパッチのほうがマシ。動くかはシラネ。
244:234
09/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
245:デフォルトの名無しさん
09/03/11 20:47:29
あーはいはいそうだねすごいね
246:デフォルトの名無しさん
09/03/11 20:49:08
少ないけど、何か?
247:デフォルトの名無しさん
09/03/11 20:52:59
>>244
そんなRuby使うのやめちゃったらいいよ
折れは使うけど
248:デフォルトの名無しさん
09/03/11 21:07:41
[#15907] Patch for FileUtils#chown (specifically: FileUtils#fu_get_gid)
URLリンク(rubyforge.org)
249:234
09/03/11 21:15:23
>>248
そのパッチが公開されたの2007年じゃんワロタww
いつになったら適用されるんだろうね
250:デフォルトの名無しさん
09/03/11 21:31:57
redmineに移行して忘れ去られていると見た。
251:234
09/03/11 21:35:44
じゃあ誰か報告してあげなよ。
俺はたいして英語が書けない読めない喋れない聞き取れない
現役高校生だし、当然職業プログラマでもないからやめておくが・・・
252:デフォルトの名無しさん
09/03/11 21:37:42
日本語でおk
なんだが。
253:デフォルトの名無しさん
09/03/11 21:56:37
報告してあげた。
URLリンク(redmine.ruby-lang.org)
254:234
09/03/11 22:03:30
なんだよー、日本語でいいのかよ。
だったら実名で報告しておけばよかったなー。
そんで俺が有名になって、クラスの女の子たちから告白されて
スーパーハカーになっちゃったりして、んでもって将来かわいいお嫁さんと結婚したら
君たちは嫉妬しちゃって鳴門大橋から飛び降りることだろうw
まあとにかく>>253さんありがとう!
255:234
09/03/11 22:04:38
# FIXME
256:デフォルトの名無しさん
09/03/11 22:12:29
フィールドがタブ区切りで、行区切りがCrのデータを処理するときなんですが,
csv = CSV::open('data.csv', 'r')
csv.each{|r|レコード処理その1}
としたあと
csv.each{|r|レコード処理その2}
をしたくてもデータがnilとなっていて,うまく処理できません。
今は,改めてcsv = CSV::open('data.csv', 'r')で再オープンしているのですが
io.rewindみたいなもっといい方法はないですか?
処理の都合上csv.each{|r|レコード処理その1;レコード処理その2}はできません。
(ようするに最後のレコードまでいって,もう一度はじめからの処理が必要)
257:デフォルトの名無しさん
09/03/11 22:37:52
open_readerの定義を参考に
CSV::Reader.parse(io, fs, rs) do end
io.rewind
CSV::Reader.parse(io, fs, rs) do end
とでもやるしかなさそうな気がするが、
CSV再オープンと大して変わらないかな。
258:デフォルトの名無しさん
09/03/11 23:08:07
fastercsvのソースにはrewindがあったけどどう使うかは知らん
259:デフォルトの名無しさん
09/03/12 02:32:42
class C
def initialize
@n = 50
end
def n
return @n
end
def n=(n)
@n += n - self.n
end
end
c = C.new
b = c
b.n = 20
p c.n
これを実行すると20と表示されます
c = 50
b = c
b = 20
p c
これは50と表示されます
ここの辺り、それぞれの結果に差が出る理由などが漠然としか理解できていないのですが
上手く解説してるサイト等ご存知でしたら教えてください
260:デフォルトの名無しさん
09/03/12 02:54:22
# C インスタンスを生成し c に代入
c = C.new
# c のインスタンスに b からもアクセス出来るようにする
b = c
# b(==c) の内部変数に 20 を代入する
b.n = 20
# b と c は同じオブジェクト(C インスタンス)
# 変数 c に 50 を代入 : b=nil c=50
c = 50
# 変数 b に c の値を代入 : b=50 c=50
b = c
# 変数 b に 20 を代入 : b=20 c=50
b = 20
# b と c は別のオブジェクト(20 : 50)
261:デフォルトの名無しさん
09/03/12 03:00:52
センスって都合のいい言葉だな。
でもそのセンス大事な言語仕様なら、もうちょっと厳密に固めた方がいいと思う。今の再利用の際に謎解きが必要な仕様では、オブジェクト指向のメリットである再利用が阻害されるだけ。
262:デフォルトの名無しさん
09/03/12 04:16:25
>>261
《厳密》に動作してるよ
お前のプライドを満たすために言語があるわけじゃない
263:デフォルトの名無しさん
09/03/12 04:24:33
Javaでスパゲティが作れてしまった時点で人類は認識を改めなければならなかった
プログラミング言語側に責任を負わせるのは誤りなのだと
264:デフォルトの名無しさん
09/03/12 08:21:55
>>263
どんだけ、敷居を下げた言語つくってもスパゲッティコードは量産されるの法則
265:デフォルトの名無しさん
09/03/12 08:54:49
質問があります。
RubyでExcelのスプレッドシートを扱う簡単なライブラリでオススメはないでしょうか?
通常はOLE直で使うものなんでしょうか?
266:デフォルトの名無しさん
09/03/12 09:10:11
>>263
頭の中がスパゲッティなら出てくるものもスパゲッティw
これ真理
267:デフォルトの名無しさん
09/03/12 10:07:20
>>265
gem install spreadsheet-excel
268:デフォルトの名無しさん
09/03/12 10:11:05
>>259
どういう動作をするほうがいいと思った?
269:デフォルトの名無しさん
09/03/12 10:32:03
やっぱプログラマも免許制にした方がいいな。
質の悪いプログラマがいつまでも駆逐できない。
270:デフォルトの名無しさん
09/03/12 10:32:13
>>267
License: GNU General Public License (GPL) version 3 (´・ω・`)
納品する時に rubyscript2exe で固めたらGPLの影響受けますよね、やっぱ・・・
ライセンス問題なさそうなのなら、これでいけるかな・・・
RAA - spreadsheet
URLリンク(raa.ruby-lang.org)
271:デフォルトの名無しさん
09/03/12 23:55:38
>>270
ソース公開しちゃいなよw
272:デフォルトの名無しさん
09/03/13 00:29:08
ソース公開したらパクって一儲けします。
273:デフォルトの名無しさん
09/03/13 03:07:30
gem の再インストールをしようと思ってるんですが、今までgemでインストールしたライブラリを全部一気に削除するにはどうすればいいでしょうか?
やはり gem uninstall で一個ずつ手作業?それともgemのディレクトリ削除するだけでgemでインストールしたライブラリも全部削除したことになるのでしょうか?
274:デフォルトの名無しさん
09/03/13 04:23:04
URLリンク(d.hatena.ne.jp)
このページの最初のサンプルを参考に
agent.get('URLリンク(search.yahoo.co.jp)')
の所を
agent.get('URLリンク(www.google.co.jp)')
にしてみら
undefined method `field_with' for nil:NilClass (NoMethodError)
というエラーが出ました、何が原因なでしょうか?
275:デフォルトの名無しさん
09/03/13 04:36:20
>>274
参照ページの処理がYahooのページ構造に依存しているだけ
googleに対応させたければGoogleのページ構造に合わせて
スクリプトを修正する必要がある
276:デフォルトの名無しさん
09/03/13 04:40:55
>>275
具体的にはどこをどうすればいいのでしょうか。
取りあえず、いろいろ試しているんですが分かりません。
277:276
09/03/13 05:43:48
すみません自己解決です、今のところ理由は不明ですが
agent.user_agent_alias = 'Windows IE 7'
を入れてたら動きました、これから理由を探っていきます
ありがとうございました。
278:デフォルトの名無しさん
09/03/13 07:50:36
>>273
gem list | awk '{print $1}' | xargs sudo gem uninstall -a
とかどうだろう
gem のディレクトリを消しても /usr/local/bin とかにスクリプトファイルがインストールされているからね。rakeとか。
279:デフォルトの名無しさん
09/03/13 16:24:22
railsなどrubyで書かれたソースを読むのに便利なツールはないでしょうか?
Cでいうところのgloboe,phpのphpxrefのようなツールがあると最高です。
280:デフォルトの名無しさん
09/03/13 16:36:49
ソース読んだほうが早いということになってる
281:デフォルトの名無しさん
09/03/13 16:39:19
Railsは「Rubyではない」ので、Rubyとは別に考えてください
282:276
09/03/13 16:53:46
たびたびすみません
require 'rubygems'
require 'mechanize'
require 'nokogiri'
require 'kconv'
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
page=agent.get(URI.parse('URLリンク(www.google.co.jp)'))
puts page.forms[0]
だときちんとformが表示されるのですがアドレスを
URLリンク(be.2ch.net)
にするとnilといわれます、該当ページのbodyを表示しても
きちんとformは存在しているのでどこかがまずいはずなのですが
分かりません、よろしくお願いします。
283:デフォルトの名無しさん
09/03/13 17:28:52
>>282
あはは、libxml2 は来るなって HTML に書いてある
これは libxml2 がパースできないタイプの HTML の書き方だ
自前で POST するか、あるいは Hpricot を使う
require 'rubygems'
require 'mechanize'
require 'hpricot'
require 'kconv'
WWW::Mechanize.html_parser = Hpricot
agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
uri = URI.parse('URLリンク(be.2ch.net)')
agent.get(uri).form_with(:action =>'/test/login.php'){|f|
f.set_fields('m' => ['mail_address'], 'p' => ['password'])
}.click_button
284:276
09/03/13 18:33:26
>>283
ありがとうございます。
まだ良く理解できていないと思いますが精進します。
285:デフォルトの名無しさん
09/03/13 19:13:24
わーい、Mechanize の質問だ
>>283
残念惜しいこれパースできます
>>282
で、はっきり言うと WWW::Mechanize 0.9.2 のバグです(Nokogiri は悪くないです)
Mechanize 内部で UTF-8 に強制変換している可能性をすっかり忘れて、
元の HTML の文字エンコーディングを Nokogiri に渡しています
日本語のサイトで Mechanize を使う場合は、しばらく
agent.get(uri){|p| p.encoding = "utf-8"}
というように、HTML のエンコーディングを UTF-8 に強制指定してください
(irb でも動作するので、この書き方がいちばん楽です)
UTF-8 に変換されない組み合わせというのも確かにあるんですが、
こんなのいちいち覚えるのは無駄なので、とりあえず UTF-8 で試して、失敗したら変更するようにしましょう
Nokogiri との組み合わせを見捨てて、 >>283 のように Hpricot を使うようにしてももろちん構いません
286:デフォルトの名無しさん
09/03/13 19:23:50
Emacsでruby-modeを使うと、if や do を入力すると勝手に end が入力されてうっとおしいのですが
これをやめさせるにはどうしたらいいですか。
do のあとにスペースをいれるとendが入るのに、doの直後で改行するとendが入らないとか
中途半端な仕様なのでやめたいです。
287:デフォルトの名無しさん
09/03/13 19:27:34
>>286
それは ruby-electric の担当であって ruby-mode の仕事じゃないんじゃね
(add-hook 'ruby-mode-hook
'(lambda () (ruby-electric-mode nil)))
これでどう
ruby-electric 自体をやめてしまってもいい
288:276
09/03/13 20:09:05
>>285
ありがとうございます。
>WWW::Mechanize 0.9.2 のバグです
最初に自分で調べていたらそれっぽいなと思いましたがよく分からなかったので放棄してました
有名なライブラリでもバグとかあるんですね、分からずに使ってる身としては早く直って欲しいです。
289:デフォルトの名無しさん
09/03/13 20:26:23
正直なとこ、これに関しては直る可能性はかなり薄いです
開発版で直る機会があったんですが、あっさりエンバグして 0.9.2 になりました
日本語サイトの一般的な利用法に関する知識を持った(そして英語で議論できる)人がいないんです
290:286
09/03/14 00:37:13
>>287
やってみたんですけど変化なしでした。
デフォルトでruby-mode-hook に (ruby-electric-mode t) が設定されているようで、
自分の設定よりもデフォルトの設定のほうが優先されているようです。
(setq ruby-mode-hook
(append ruby-mode-hook '(lambda () (ruby-electric-mode)))
としたほうがいいでしょうか。
291:デフォルトの名無しさん
09/03/14 00:59:26
>>286
ruby-electric-mode の方にその手のことを制御する変数があったと思うけど
(add-hook 'ruby-mode-hook
(lambda()
(inf-ruby-keys)
(require 'ruby-electric)
(ruby-electric-mode t)
;; (setq ruby-electric-newline-before-closing-bracket t)
))
この設定例における変数 ruby-electric-newline-before-closing-bracket に
類するものが他にもあるはずなのでスクリプトを調べてみるべし
292:デフォルトの名無しさん
09/03/14 01:45:47
質問です。RubyにはSQLiteなどが、標準搭載されることはないのでしょうか?
レンタルサーバーや、自分以外の管理の場合に不便です。
293:デフォルトの名無しさん
09/03/14 02:16:37
要望の説得力によってはありえるかもしれない。
過去にreadlineやopensslのラッパーが標準付属になったりしたわけだし。
294:デフォルトの名無しさん
09/03/14 04:54:59
松本尊師が拒否したら無理だろうな。GUIのように。
295:デフォルトの名無しさん
09/03/14 10:09:53
URLリンク(blade.nagaokaut.ac.jp)
最重要はコレ * メンテナは確保できるか
296:デフォルトの名無しさん
09/03/14 10:54:46
TMail でいいじゃん
297:デフォルトの名無しさん
09/03/14 11:42:35
>>296
脊髄反射乙
298:デフォルトの名無しさん
09/03/14 12:08:23
質問
クラスファイルの中に、いい例が思いつかないんですがたとえば
%w(hoge hage mage).each do |param|
eval("def get_#{param}; @#{param}; end")
eval("def set_#{param}=(v); @#{param}=v; end")
end
のように、全く動的でない固定の5個くらいの文字列から20個くらいメソッドを作る処理を書くのって無駄ですよね?
メソッドを書くスクリプトの処理結果をベタ張りするべきですよね?
RDocにも拾ってもらえないしいいとこなしですよね?
299:デフォルトの名無しさん
09/03/14 12:24:43
そいや、sqlite3-rubyは最近開発者が燃え尽きた(burned out)ような。
weblog.jamisbuck.org/2009/2/25/net-ssh-capistrano-and-saying-goodbye
300:デフォルトの名無しさん
09/03/14 13:25:12
>>298
それが規約や共通処理的なものであるならプロジェクトに
よっては意味があるかもしれない
元の処理が何故そう書かれたのかを確認すればいいだけの話じゃないの?
301:デフォルトの名無しさん
09/03/14 14:16:13
>>294
少しはPythonを見習って欲しいな
>>299
丁度いい機会だから、SQLiteくらいは組み込んで欲しいよな
誰がメンテしてくれるのかは、知らないが・・・
Railsとかどうなるんだろう?最悪引き取ってくれるのかな?
302:デフォルトの名無しさん
09/03/14 14:37:40
JRubyでJavaのオブジェクトを明示的にキャストするにはどうしたらいいんでしょうか?
具体的にはGraphics型をGraphics2D型にダウンキャストしたいです。
303:302
09/03/14 16:13:30
すみません、自己解決しました。
JRubyでは内部的にSunGraphics2D型になっているようでした。
#僕自身は解決したんですが、JRubyの型指定ってどういう風にやってるんですかね。
#Javaは素人なんですが、明示的に型指定できなくても(Java側で)困る状況にならないってことなのかな。
それと、JRubyの質問ってここでしても良かったんでしょうか?
スレ違いだったなら申し訳ないです。
304:デフォルトの名無しさん
09/03/14 17:36:53
Class ClassA
def initialize
b = ClassB.new
c = ClassC.new
end
end
Class ClassD
def initialize
e = ClassE.new
c = ClassC.new
end
end
a = ClassA.new
d = ClassD.new
if (何か)
n = a.b
else
n = d.b
end
このような状態で、nを使ってcにアクセスするにはどうすればよいでしょうか?
305:デフォルトの名無しさん
09/03/14 17:43:00
ミスとインデントを修正しました。すみません
Class ClassA
def initialize
b = ClassB.new
c = ClassC.new
end
end
Class ClassD
def initialize
e = ClassE.new
c = ClassC.new
end
end
a = ClassA.new
d = ClassD.new
if (何か)
n = a.b
else
n = d.e
end
306:デフォルトの名無しさん
09/03/14 17:48:24
>>305
一般的に、a や d を持って来るべき
hoge(v)
# v は n であり、n から c を呼び出して何かする
end
hoge(n)
ではなく
hoge(v, n)
…
end
hoge(a, n) または hoge(b, n)
または
hoge(v)
# n = v.b または n = v.e
…
end
hoge(a) または hoge(b)
という構造にすることを真っ先に考えるべき
307:デフォルトの名無しさん
09/03/14 18:10:59
私もそれがベストだとは思うのですが…
>>305から
c = ClassC.new を行っている2行を除いたのが元の状態で
それに手を加えて c = ClassC.new の追加と、nからの参照をしたい、という状況です
他が色々出来上がってしまっているので
hoge(v)をhoge(v, n)に修正するのは1から作り直すのと同じような状態です
308:デフォルトの名無しさん
09/03/14 18:22:03
あまりスマートではないけど、
Class[B,C,E]にルートオブジェクトを示す変数を入れて、
ルート側のinitializeで初期化するようにしたらどう?
309:デフォルトの名無しさん
09/03/14 18:25:40
ありがとうございます。
ひとまずそれでやってみます。
310:デフォルトの名無しさん
09/03/14 18:26:17
相互参照にする
b = a.b
c = b.a.c
クラス B E に C への参照を持たせる
c = a.b.c
可変引数を使う
def hoge(*args)
case args.size
when 1 ...
when 2 ...
311:デフォルトの名無しさん
09/03/14 19:28:50
質問させてください。
以下のようなコードを書いたのですが、
File::open(ARGV[0], "r") { |f|
f.each {|line| print line }
}
このコードに
・このプログラムの実行時に引数がなかった場合(ARGV[0]がnilだった場合)に適切なエラーメッセージを標準入力に表示させる処理
・ファイルオープンに失敗した場合に適切なエラーメッセージを標準入力に表示させる処理
の二つを加えたいのですが、ruby的に一番スマートな書き方を教えていただきたいのです。
ifとかelseとかを多用するのはruby的には美しくないのかな?と・・・
ご教示頂けると嬉しいです。
312:デフォルトの名無しさん
09/03/14 19:31:21
勝手にしろ
313:デフォルトの名無しさん
09/03/14 19:39:41
> 標準入力に表示させる処理
かなり高難易度な気がする・・・
314:デフォルトの名無しさん
09/03/14 19:40:17
例外をキャッチキャッチキャッチして
スタンダードエラーアウトプットにプットプットプット!!!!
315:311
09/03/14 19:54:35
すいません間違えました。標準出力です。
316:デフォルトの名無しさん
09/03/14 20:09:12
>>312がFAではある
raise "引数を指定してください" unless ARGV[0]
begin
File::open(ARGV[0], "r") { |f|
f.each {|line| print line }
}
rescue Errno::ENOENT => ex
raise "#{ARGV[0]} が存在しません"
end
基本はこんなんだと思う
あとは好きに改造なり省略なりしれ
317:デフォルトの名無しさん
09/03/14 20:16:35
あ、最初の例外は ArgumentError であるべきという話もあるが好きにしてくれ
raise(ArgumentError, "引数を指定してください") unless ARGV[0]
RuntimeError 以外の例外は「第三者がrescueするかどうか」でとりあえず決めていい
誰も rescue しない例外で自作例外クラスを作ったりするのは自己満足以外の何物でもない
318:デフォルトの名無しさん
09/03/14 23:47:02
>>311程度の条件なら例外で振り分けることも出来る(おすすめはしない)
begin
open(ARGV.fetch(0),'r') {|f| ... }
rescue IndexError # ARGV[0]がnil
puts "引数を指定してください"
rescue # その他ファイル周辺の例外
puts $!
end
rubyに限らずオブジェクト指向言語なら多態性を利用する事で
制御構造部分の記述を削減できるけど、311に適用出来る所はないね
普通にif文使って事前チェックをするのが正しいと思う
319:デフォルトの名無しさん
09/03/14 23:59:09
>>311
コマンドライン引数の処理はoptparse使え、常考。
URLリンク(www.ruby-lang.org)
320:デフォルトの名無しさん
09/03/15 03:20:31
折角だからWindowsXPに1.91を入れようと思っているんですが、
ワンクリックでインストールできるRubyとかないんでしょうか。
コンパイルとかできんし。
321:デフォルトの名無しさん
09/03/15 05:41:50
>>320
ワンクリックとはいかないが1.9.1のバイナリならこの辺
URLリンク(www.artonx.org)
URLリンク(www.garbagecollect.jp)
322:デフォルトの名無しさん
09/03/15 07:00:27
>>319
引数を受け取るだけの仕事にoptparseを持ち出すのはただの馬鹿
323:デフォルトの名無しさん
09/03/15 09:52:13
>>321
どうもです。早速試してみます。楽しみ楽しみ。
324:デフォルトの名無しさん
09/03/15 12:57:21
class G
attr_accessor :a
def initialize
@a = []
@m = M.new(@a)
@a = [5]
end
end
class M
def initialize(a)
@b = a
end
def output
p @b
end
end
g = G.new
g.m.output
このプログラムの結果は 5 ですよね?
その後 g.a を変えると output の結果も変わると思います
ところが g = G.new から g.m.output の間に
何をしているのかよくわからないんですが色々な処理が挟まっていて
g.a を変化させても(変化しているのに)結果が 5 のままになっています
間でどのような処理が行われている可能性があるんでしょうか?
325:デフォルトの名無しさん
09/03/15 13:02:41
>>324
> このプログラムの結果は 5 ですよね?
rubytest.rb:20: undefined method `m' for #<G:0xb7c4e638 @m=#<M:0xb7c4e598 @b=[]>, @a=[5]> (NoMethodError)
空気を読んで G の attr_accessor に :m を追加した結果
[]
326:デフォルトの名無しさん
09/03/15 13:11:46
簡略化したつもりが間違ってたみたいです
すみませんでした
どこがどうなってるんだろう…
327:デフォルトの名無しさん
09/03/15 13:11:49
前回書こうと思って面倒になって消したんだが、Rubyの変数は名札だ
メソッドが普段直接参照してるのは、変数の名前ではなく、オブジェクトID
変数はオブジェクトIDをわかりやすく書き手とメソッドに伝える名札に過ぎない
@a = []
@m = M.new(@a)
@a = [5]
は、
「@a が [] になって M.new の引数に渡されて、さらに [5] に変化した(ので M.newに渡したものも [5] になっている)」
と見るのではなく
「[] というオブジェクトを @a という名前で呼ぶ、
@a という名前のついたオブジェクトを M.new に渡す、
[5] という(先の [] とは別物の)オブジェクトを @a という名前で呼ぶ」
と見るのが正しい
ということで、やりたいことは
@a = []
@m = M.new(@a)
@a.push(5)
とすればいい
これなら @a は最初から最後まで同じオブジェクトを指すことができる
328:デフォルトの名無しさん
09/03/15 13:21:22
class G
def initialize
@a = []
p @a.object_id
@a.push(5)
p @a.object_id
@a = [5]
p @a.object_id
end
end
G.new
結果
-605095318 (最初)
-605095318 (同じ)
-605095348 (違う)
@a = で2度目の代入が行われた時点で、 1回目で [] だったオブジェクトを@a という名前で使うことはできない
329:デフォルトの名無しさん
09/03/15 13:22:18
>>325>>327>>328
ありがとうございます
おかげで少し理解できてきました
>>324の @a = [5] はこっちに書くときのミスで実際は @a[0] = 5 でした
これなら出力も 5 になると思います
そして>>324の質問の答えは『@aの参照先が変わる処理が行われた』ですね
再び質問なんですが、@aの参照先が変わろうとも、常に@aと同じものを参照する変数を用意する事はできますか?
330:デフォルトの名無しさん
09/03/15 13:31:20
変数とはデータを入れる箱である、というメタファーは Ruby では完全に誤りで誤解の元
箱ごと移動できそうに見えてしまうからね
オブジェクトが厳然と存在していて、それに補助的にぺたっとつくのが変数という名前のラベル
a = []
b = a
c = b
d = c
は、
「d の中に c があってその中に b が、 その中に a があってそれの中に [] という空の配列データが入ってる」
という状態ではなく
「配列オブジェクト [] に、変数名ラベルの a、b、c、d がぺたぺた貼られていてどの名前を使っても参照できる」
という状態
>>329
参照先が変わって困るような変数の場合はその名前を使い回してはいけない
オブジェクトには複数の変数名を持たせることができるから、適当な別名をつければどうとでもなるよ
331:デフォルトの名無しさん
09/03/15 13:38:24
@a = 初期値
b = @a
@a = 別な値
p b #=> 初期値
> 参照先が変わって困るような変数の場合はその名前を使い回してはいけない
が正しいな
@a をあとで使うのなら、@c = 別な値 とでもすべき
本来のスクリプトでどういう構造になってるかにもよるから、別にいいんだが
332:デフォルトの名無しさん
09/03/15 13:38:36
>>322
うるせー馬鹿
引数にオプション渡されたらどうするんだよハゲ
適切なエラーメッセージを出したいって言ってるだろう?
あと、vやhオプションを実装しろっていう暗黙の命令
333:デフォルトの名無しさん
09/03/15 13:41:21
>>330>>331
わかりました
詳しい説明ありがとうございました
334:デフォルトの名無しさん
09/03/15 13:41:59
> このリファレンスマニュアルは、Ruby 1.9 に関して、言語仕様、組み込みライブラリ、
> 標準添付ライブラリのいずれにもまったく対応していません。信用してはいけません。
(´,_ゝ`)プッ
335:デフォルトの名無しさん
09/03/15 13:44:18
>>334
文句あるならオフィシャルのマニュアル使って下さい
336:デフォルトの名無しさん
09/03/15 13:48:58
> 執筆者募集中
(´,_ゝ`)プッ
337:デフォルトの名無しさん
09/03/15 15:06:30
∧_∧
(⌒⌒ヽ ( ・ω・) あ、ワリ、屁こいちゃった
( プッ!! ゝ∪ )
丶~ '´ (___)__)
338:デフォルトの名無しさん
09/03/15 15:27:29
1.9って思いきって名前変えれば良かったのにな。
ruby vista 1.0とか。
339:デフォルトの名無しさん
09/03/15 15:29:08
それは 2.0 の役目です
1.9 シリーズはただの橋頭堡
340:デフォルトの名無しさん
09/03/15 16:40:53
1.10は?
341:デフォルトの名無しさん
09/03/15 17:15:56
>>339
橋頭堡というか里程標というか
342:デフォルトの名無しさん
09/03/15 23:47:47
誰か教えて
f(a,b) = a^b
但し a, b は実数 (実際は有限桁です)
を100桁ぐらいの精度で出したいんだけどどうすればいいですか?
bigdecimalとか使ってもうまくいかない
343:デフォルトの名無しさん
09/03/15 23:56:52
「うまくいかない」なら「しかたがない」だろ
344:デフォルトの名無しさん
09/03/16 00:03:47
まず自分がどうやって、
どううまくいかなかったか書かなきゃダメだろ
345:デフォルトの名無しさん
09/03/16 02:49:37
そもそもその精度に意味が有るのか検証したほうが。
つ有効桁数
346:デフォルトの名無しさん
09/03/16 07:14:52
ちょっと解釈がわからないところがあるので質問させてください。
以下のようなコードを実行した場合
$KCODE = 'n'
print 'あいう'.match(/\W+/), "\n" #結果 => あいう
$KCODE = 's'
print 'あいう'.match(/\W+/), "\n" #結果 => nil
右のコメントにあるような結果になってしまうのですが
これはどういう事なんでしょうか?
マルチバイト文字を認識可能にすると
何故正規表現の「\W」が機能しなくなるのでしょうか?
$KCODE='n'の時に「\W」が機能しないという逆の状態なら納得できるのですが…
347:デフォルトの名無しさん
09/03/16 07:30:35
>>346
\w の意味は? \W はその補集合だよな? な?
348:デフォルトの名無しさん
09/03/16 07:41:37
>>347
やっと意味がわかりました。
文字コードを指定する事でマルチバイト文字も
「\W」の認識形式に含まれるという事ですね。
文字コードを指定した場合の「\W」は
「英数文字+マルチバイト文字『以外』の文字」という事になるのですね。
つまりそこに引っ掛かる文字は主に「記号」になると。
この認識でいいですか?
349:訂正
09/03/16 07:43:07
× 「\W」の認識形式に含まれるという事ですね。
○ 「\w」の認識形式に含まれるという事ですね。
350:デフォルトの名無しさん
09/03/16 09:13:48
>>342
1.23**4.56 => 2.5702023016193 <----これでは足りないという事なら
123**456 => (ry
↑の結果をMath.logを使って元の値を求める。
351:デフォルトの名無しさん
09/03/16 09:40:15
>>348
\w は「単語構成文字」
何を単語を構成する文字とみなすかは文脈によって変わるってこと
352:デフォルトの名無しさん
09/03/16 09:45:01
>>348
「詳説 正規表現」っていう本を読んでみるといいお
353:デフォルトの名無しさん
09/03/16 09:48:32
irb> puts 'あいう'.tosjis.inspect
"\202\240\202\242\202\244"
irb> puts 'あいう'.tosjis.match(/\W/n).inspect
#<MatchData "\202">
irb> puts 'あいう'.tosjis.match(/\W/s).inspect
nil
irb> puts 'あいう'.tosjis.match(/\w/s).inspect
#<MatchData "\202\240">
354:デフォルトの名無しさん
09/03/16 09:57:02
正規表現は関係なくて、日本語マルチバイト文字とはなんぞやという話だな
puts '表示'.tosjis.match(/\w/s).inspect
#<MatchData "\225\\">
355:デフォルトの名無しさん
09/03/16 17:15:40
nitems って何の略ですか?
nil items?
356:デフォルトの名無しさん
09/03/16 17:18:06
number of items だと思う。
ていうかどういう場所に現れたのかわからないと答えようがない。
357:デフォルトの名無しさん
09/03/16 17:30:33
Array#nitems なら Number of ITEMS で項目数
Ruby 1.9 では無くなったメソッドだ
nitem という言葉自体はプログラミングでは一般的な略語で項目数を表す
358:355
09/03/16 17:42:13
>>356-357
ありがと!
そうか、1.9 ではなくなったんですね。
359:デフォルトの名無しさん
09/03/16 18:59:04
こんなとき、nitem いいですか。
360:デフォルトの名無しさん
09/03/16 19:01:24
好きなだけ nitem いいよ
361:デフォルトの名無しさん
09/03/16 20:15:18
ここは nitem 持っとかないと
362:311
09/03/16 20:26:10
レスありがとうございます。参考にさせて頂きます。m(_ _)m
363:じゃなくて311
09/03/16 20:27:51
レスありがとうございます。参考にさせて頂きます。m(_ _)m
364:デフォルトの名無しさん
09/03/17 16:11:43
少しお聞きします。
文字列が空文字列(nilではない)かどうか?を調べる一般的な方法(定石、慣例)というのはないのでしょうか?
例:
s = ""
do_hoge if s != ""
こんなんでいいの?if s だと駄目みたいだし。(""はRubyではfalseにならない)
365:デフォルトの名無しさん
09/03/17 16:19:25
>>364
String#empty? ってのがある。
366:デフォルトの名無しさん
09/03/17 16:22:13
通常の処理 unless str.empty?
if str.empty? then 何かエラー処理 end
というのがイディオム的ではある
367:デフォルトの名無しさん
09/03/17 16:50:20
str が nil のときでも str.empty? は呼べますか?
368:デフォルトの名無しさん
09/03/17 16:52:41
$ ruby -e 'str = nil ; str.empty?'
-e:1: undefined method `empty?' for nil:NilClass (NoMethodError)
369:デフォルトの名無しさん
09/03/17 16:54:26
>>367
あ、そうか
str が nil である可能性が幾ばくかでもある場合は
str && !str.empty?
とか書く
途端にめんどくさい感じになって、俺はあまり好きではない
370:デフォルトの名無しさん
09/03/17 16:58:55
>>369
「nil を empty と同一視したいとき」だな
nil は 0 や "" と違う扱いを受けるべき
というのが理想論
371:デフォルトの名無しさん
09/03/17 17:04:16
どうせ俺専用スクリプトだ!てことで
class NilClass
def empty?
true
end
end
とかって邪道?
372:デフォルトの名無しさん
09/03/17 17:08:57
>>371
駄目
373:デフォルトの名無しさん
09/03/17 17:17:19
RailsならObject#blank?
374:デフォルトの名無しさん
09/03/17 17:20:16
組み込みクラスの拡張は、既存の動作に影響を及ぼさない限りにおいてのみ是
str.empty? が NoMethodError で例外を出して終了することを前提にしているライブラリがうまく動作しなくなるから、
>>371は「やってはならない」
というか、is_empty? とかそういう関数的メソッドを定義したほうがなんぼか素直だと思われる
375:デフォルトの名無しさん
09/03/17 17:28:09
>>369
なんかそれキモイw
str.nil? or str.empty?
376:371
09/03/17 17:46:47
なるほど、ためになりました。
377:デフォルトの名無しさん
09/03/17 21:41:00
Object#tryは正式採用されるだろうか。
378:デフォルトの名無しさん
09/03/18 00:49:36
nil には nil? があって
すべての object にも nil? があるのですね
379:デフォルトの名無しさん
09/03/18 00:57:31
NilClassを含む全ての基底クラスであるObjectのメソッドだしねぇ
380:デフォルトの名無しさん
09/03/18 01:01:29
と書いてふと思った。
「一切の例外なくObjectを継承してる」と断言していいんだっけ?
381:デフォルトの名無しさん
09/03/18 01:03:05
つ BasicObject (1.9)
382:デフォルトの名無しさん
09/03/18 01:03:43
BasicObjectが出来たので駄目
383:デフォルトの名無しさん
09/03/18 01:05:58
>>380
1.8ではOK
384:デフォルトの名無しさん
09/03/18 01:15:15
なんぞそれw
調べてみるサンクス
385:デフォルトの名無しさん
09/03/18 01:33:52
URLリンク(doc.loveruby.net)
説明としてはこのへんかね。