Ruby 初心者スレッド Part 19at TECH
Ruby 初心者スレッド Part 19 - 暇つぶし2ch1:デフォルトの名無しさん
08/04/14 00:26:33
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す URLリンク(www.ruby-lang.org)
 ・FAQを一応読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


2:デフォルトの名無しさん
08/04/14 00:26:55
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す URLリンク(www.ruby-lang.org)
 ・FAQを一応読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

3:デフォルトの名無しさん
08/04/14 00:27:09
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
URLリンク(www.amazon.co.jp)


4:デフォルトの名無しさん
08/04/14 00:29:25
■前スレ
Ruby 初心者スレッド Part 18
スレリンク(tech板)

■関連スレ
Rubyについて Part 31
スレリンク(tech板)

Rubyの宿題教えてください。
スレリンク(tech板)
スレリンク(tech板)

【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)

Ruby on Rails
スレリンク(tech板)

Rubyについて(アンチ専用) Part003
スレリンク(tech板)

5:デフォルトの名無しさん
08/04/14 00:30:31
■公式/非公式関連リンク
Ruby Home Page
URLリンク(www.ruby-lang.org)

Rubyリファレンス(よくサーバーエラーになります)
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) (英語)

リファレンスのHTMLヘルプ版配布
URLリンク(elbereth-hp.hp.infoseek.co.jp)
# Windowsで便利

Ruby FAQ
URLリンク(ruby-lang.org)

Programming Ruby - The Pragmatic Programmer's Guide
URLリンク(www.ruby-doc.org)
# 好評書籍をWebで公開中、ただし英語

逆引きRuby
URLリンク(www.namaraii.com)

6:デフォルトの名無しさん
08/04/14 00:31:02
RAA - Ruby Application Archive
URLリンク(raa.ruby-lang.org)

RubyForge
URLリンク(www.rubyforge.org)
# Rubyのアプリやライブラリが検索できる

日本Rubyの会 公式Wiki
URLリンク(jp.rubyist.net)
# メニューに表示されていない埋もれた情報ページ多数

Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)
# コードレビューが好評

Ruby hotlinks 五月雨版(日記やblogのアンテナ)
URLリンク(www.rubyist.net)

Rubyの本一覧
URLリンク(www.ruby-lang.org)

<rubyXML/>
URLリンク(www.rubyxml.com)

Matzにっき(Ruby作者の日記)
URLリンク(www.rubyist.net)

7:デフォルトの名無しさん
08/04/14 00:39:18
乙乙

8:デフォルトの名無しさん
08/04/14 00:41:13
Otz

9:デフォルトの名無しさん
08/04/14 00:42:26
■最近できたWiki
Ruby 初心者スレッド Hiki
URLリンク(starlet.s145.xrea.com)

Ruby Portal
URLリンク(ruby.morphball.net)

10:デフォルトの名無しさん
08/04/14 00:44:07
これでテンプレ全部。
>>1>>2が恐ろしいほど瓜二つなのはるびま添削本の呪い。

11:デフォルトの名無しさん
08/04/14 11:47:16
文字列リテラルの説明で

> 空白を間に挟んだ文字列リテラルは、コンパイル時に1つの文字列リテラルと見倣されます。

とあったので C の文字列の要領で

print("foo"
"bar")

とやったら syntax error になってしまいました。

この場合の「空白」には改行などは含まれていないということだと思いますが、
これって何でなんでしょうか?
改行も仲間に入れてあげても別にバチは当たらないと思うのですが。

12:デフォルトの名無しさん
08/04/14 11:59:18
>>11
それは実装に対する苦言?それとも、どうやったらいいか聞いてる?

前者なら、Rubyの本スレで言ってほしい。

後者なら、

print("foo" +
"bar")

でOK

13:デフォルトの名無しさん
08/04/14 12:01:39
というか、そもそもの問題としてそれに頼ったコードは書かないで欲しい
明示的に連結しとけ

14:デフォルトの名無しさん
08/04/14 12:21:11
改行があるなら \ でエスケープするのが常道

print 'foo' \
'bar' \
'baz'

print 限定で出力フィールドセパレータの $, 依存だが
コンマで区切っても単純に連結されたような見掛けで出力される

print 'foo',
'bar',
'baz'


15:デフォルトの名無しさん
08/04/14 12:51:58
>>11
えー、それだと逆にめんどくさいじゃん

def gethoge
@str = 'foo'
'hoge'
end

って書いたら @str も gethoge の返り値も foohoge になるぞ

16:デフォルトの名無しさん
08/04/14 16:07:57
>>12 >>14
質問が悪くてすみません、 folding して書きたいというのではなくて、
「前者」で経緯というか理由が知りたかったです。
ので改めて本スレで聞いてみます。

>>13
頼ると何かまずいですかね?

>>15
私の print の例の方は、括弧で括ってるのでちょっと違うような気がします。
と思って試してみたら、

def gethoge
@str = ('foo'
'hoge')
end

これだと gethoge の返り値は "hoge" になるんですね。
うーむ。

17:デフォルトの名無しさん
08/04/14 16:57:13
いや、() の有無なんて関係ない
要望は「改行を挟んだ2つの文字リテラルは連結されて解釈されて欲しい」ということだろ
そもそもの前提だって
「空白を挟んだ(あるいは挟まない)2つの文字リテラルは連結されて解釈される」
ということだ

irb> 'a' 'b'
"ab"
irb> 'a''b'
"ab"
irb> eval("'a'\t'b'")
"ab"

あと、その gethoge の () は2つの式がグルーピングされてるだけだ
機械的に最後の式の 'hoge' が評価されてるだけに過ぎない

def gethoge
@str = ('foo'; 'hoge')
end

と全く同じこと

18:デフォルトの名無しさん
08/04/14 17:01:31
改行で式が繋がるのは上の方に書いてある通りで、リテラルはその対象じゃないと
括弧の有無だけでは、中の式までは面倒みませんってことかな

19:デフォルトの名無しさん
08/04/14 17:07:37
いや、コンパイル時にどう扱われるかだけの問題だから…
'a' 'b' 'c'
と書いてあったなら、それは 'abc' と書いてあるものとみなされて String オブジェクトになる

20:11
08/04/14 17:29:05
うーん、どうも私がリファレンスマニュアルを読み違えてるだけな気がしてきました。
「字句構造」のところには

> 空白文字とはスペース、タブ、垂直タブ、バックスペース、キャリッジリターン、
> ラインフィード、改ページです。

とありますが、以降の記述では、
「空白」「空白文字」が文脈によって改行を含んだり含まなかったりするんですね。
読解力が無くてすみません。

21:デフォルトの名無しさん
08/04/14 17:38:20
そのあとに改行についての記述があるだろ
Rubyにおける空白文字は改行を「含まない」
空白文字の中でホワイトスペースの代わりに使うと動作が変わるものが入ってなくもない気はするが(LFは怪しい)
とりあえず、基本的に「改行は空白文字ではない」

22:11
08/04/14 17:57:39
なるほど。

どうやら私の誤解はその改行についての記述の中の
「行が明らかに次の行に継続する時」の認識間違いから来ているようです。

print('hoge'
'fuga')

は、私には「行が明らかに次の行に継続」しているように見えていたのですが、
>>17 で指摘いただいたように、括弧には行を継続するような機能は無かったと。
わかりました。

23:デフォルトの名無しさん
08/04/14 18:05:30
行末にあるものが、文末になりえない演算子とかなら、って意味ですねそれはだいたい

24:11
08/04/14 18:08:54
ああなるほど、 >>12, >>14 の例なんかはまさにそうですね。

25:デフォルトの名無しさん
08/04/14 21:54:40
クラスの中で必要とする他パッケージはどこでrequireするのがいいですか?
使う直前、コンストラクタ内、クラス定義の外など
考えられるかと思いますが

26:デフォルトの名無しさん
08/04/14 22:13:36
基本は「最初のファイル」の先頭だと思われる

#!/usr/bin/ruby -Ku
require 'open-uri'
require 'kconv'
require 'myapplib/config.rb'
require 'myapplib/myapp.rb'
require 'myapplib/parser.rb'
require 'myapplib/rss.rb'

MyApp.new.run

こんな感じ
「require するだけで大量のファイルが読み込まれて処理が一瞬止まる」とか
「エラーが起きたときのような時しか使わないライブラリ」
のような場合は、メソッドの中で require することはある
その場合もソースファイルの先頭のどこかにコメントとして書いておくと親切

27:デフォルトの名無しさん
08/04/14 22:21:18
なるほど
必要なパッケージを明示するということですね
ありがとうございました

28:デフォルトの名無しさん
08/04/14 22:25:53
autoloadっつー便利なものもあるぜ

29:デフォルトの名無しさん
08/04/14 22:30:11
autoload は概念は便利だが実際には注意深く使わないといけないので微妙に面倒

30:デフォルトの名無しさん
08/04/14 22:35:24
指定されたファイルに存在する全てのファイルのクラスとモジュールを精査して
自動で全てを autoload する auto_require というのを作ってみるというのはどうだろう

31:デフォルトの名無しさん
08/04/14 22:38:16
>>30
requireするファイル名とクラス名に一定のルールを課すならできなくもない。
ActiveSupportにあるね。


32:デフォルトの名無しさん
08/04/14 22:47:17
Rubyには名前付き引数はないみたいですが
どう実現するのがスマートでしょうか?

33:デフォルトの名無しさん
08/04/14 22:49:05
def moge(x, y, options={})
...
end
のように最後に省略可能なハッシュを引数にとるようにし、
呼び出すときは
moge(100, 200, :foo => 0, :bar => 1)
のようにシンボルを使う。
1.9だとこれを
foo(100, 200, foo: 0, bar: 1)
とも書ける。
fooの定義ではoptions[:foo]などとして参照する。


34:デフォルトの名無しさん
08/04/14 22:50:11
fooじゃないmogeの定義


35:デフォルトの名無しさん
08/04/14 23:09:00
>>33
ありがとうございます
わりと自然な形で書けるんですね

36:デフォルトの名無しさん
08/04/14 23:22:49
言うほど自然でもないようにも思う

まあ、RoR以外のRubyではそれほど一般的ではない
あまり使わず紛らわしいオプションをユーザーに記述させたいときとかだな

37:デフォルトの名無しさん
08/04/14 23:48:00
なんか馬鹿ばっかだな
ソース読んでる?MLとか見てる?

38:デフォルトの名無しさん
08/04/15 00:03:32
オブジェクトの中から、自分のクラス名を取得するにはどうしたらいいですか?

39:デフォルトの名無しさん
08/04/15 00:16:34
>>38
obj.class

40:デフォルトの名無しさん
08/04/15 00:17:06
self.class.to_s



41:デフォルトの名無しさん
08/04/15 00:20:32
self.class.name

42:デフォルトの名無しさん
08/04/15 00:30:58
>>36
RoR系統儀とgems系統を引いたら現状のRubyはほとんど残らんと思う
どっちかに依存してると思うぞ
添付ライブラリだけの「ぴゅあ」なRubyでスクリプト作ってる人はそう多くないはず

43:デフォルトの名無しさん
08/04/15 00:42:13
>>42
んなわきゃない

44:デフォルトの名無しさん
08/04/15 00:48:36
「blank?が公式に載ってないのでおかしいと思ったらこれActiveSupportなのね」
という内容のブログの投稿が普通にある時代だからなあ

45:デフォルトの名無しさん
08/04/15 09:32:30
>>32
どちらかといえば、名前付き引数を使わないのが一番スマート
引数が複雑になりそうならこういうやり方もある

Foo.new(x, y) do |foo|
 foo.target = './dest/'
 foo.index = 10
end

この方法の利点は
Fooに存在しない名前のパラメータを設定しようとしたとき、即座にエラーを出してくれること

>>36
ハッシュで名前付き引数を渡すのは、RoR以前から広まってたぞ

46:デフォルトの名無しさん
08/04/15 11:49:20
RoRな人たちに多用というか乱用されてる感はなくもないな

47:11
08/04/15 13:29:46
なんかタイムリーな話題が ruby-dev に出ちゃっているようなのですが、
件の改行の制限は、設計方針的なものというよりも、
yacc (というか LALR(1) ?) の制限によるものなんでしょうかね。

これで私が当初からもやもやしていた疑問が大体解けた気がします。

48:デフォルトの名無しさん
08/04/15 13:35:12
「それだと正確にパースするのめんどいから」というのに類する問題っぽいのは
かなり自明だと思ってたんだがそうでもないんか

49:デフォルトの名無しさん
08/04/15 13:49:18
質問。MechanizeでWikipediaからページを取ってくるとハングアップしませんか?
agent.get('URLリンク(ja.wikipedia.org)')

50:デフォルトの名無しさん
08/04/15 13:58:39
>>49
それFAQ。ていうか「Mechanize Wikipedia」で検索くらいしろ。
あと、ハングアップではなくサーバへのアクセスの無限ループなので試すな。迷惑だから。
引数をURIオブジェクトにすると一応動作するが、それだけではURLエンコードされたリンクはたどれない。

RubyのMechanizeではパーセントつきURL文字列を処理できない
URLリンク(d.hatena.ne.jp)

ここではto_absolute_uriを動的に書き換えろって言ってるな。

51:デフォルトの名無しさん
08/04/15 14:16:01
>>50
要はバグなんですね
agent.get(URI.parse('URLリンク(ja.wikipedia.org)'))
なら動作しました

52:デフォルトの名無しさん
08/04/15 17:13:37
拡張モジュールをデバッグするために、-g をつけてコンパイル
したんですけど、Ruby 本体も -g をつけてコンパイルしなきゃ
いけませんか。
初心者でごめん。

53:11
08/04/15 17:51:13
>>48
一連のレスの中でそう指摘してくださったのは >>48 さんが初めてだと思いますので、
自明というわけでもないのではないでしょうか?

54:デフォルトの名無しさん
08/04/15 18:08:51
当たり前のことは誰も説明しない、というそれだけの話かもしれない。

55:11
08/04/15 18:20:04
うーん、当り前の話でしたか・・・

まああまりこれ以上引っ張るネタでもなさそうですし、
私も今は、世界のナベアツ Golf の方に興味が行っていますので、このへんで。

56:デフォルトの名無しさん
08/04/15 19:27:40
指定したハッシュのキーがあればその値、
なければ指定した値を取り出すための
もっとも短い書き方を教えてください
今は
hoge = moge.has_key?(key_name) ? moge[key_name]:default_value
と書いていますがmogeとkey_nameが重複していて気になります

57:デフォルトの名無しさん
08/04/15 19:31:57
hoge = moge[key_name]||default_value

とか?値が nil にも対応しないといけないんだとダメだけど。

58:デフォルトの名無しさん
08/04/15 19:34:05
hoge = moge.fetch(key_name, default_value )

59:デフォルトの名無しさん
08/04/15 19:36:21
h = Hash.new(default_value)
じゃだめかな

60:デフォルトの名無しさん
08/04/15 20:05:37
>>57-59
ありがとうございました
fetchがそのためのものですね

61:デフォルトの名無しさん
08/04/15 22:09:41
Rubyの流儀ではファイルとクラスの関係はどうですか?
他言語では一ファイル一クラスが多いようですが

62:デフォルトの名無しさん
08/04/15 22:34:36
>>52
拡張ライブラリだけ-gついてりゃ大丈夫
デバッグ情報付きのrubyがあればあったでいいとは思うけど

63:デフォルトの名無しさん
08/04/15 22:44:52
>>61
てきとう

RoRの流儀は知らない

64:デフォルトの名無しさん
08/04/15 23:40:04
コンストラクタでsyslogを開いてログを取ってるのですが
デストラクタがないためcloseする場所がないです。
どうするのがペターでしょうか?

65:デフォルトの名無しさん
08/04/15 23:48:20
明示的にcloseを外にさらけ出すとか、
ブロック構文にしてyieldからもどってきたらcloseするとか、
define_finalizerしといて適切にGC.Collectしてねと言い捨てるか。

66:デフォルトの名無しさん
08/04/15 23:48:28
>>62
さんくす

67:デフォルトの名無しさん
08/04/16 00:36:00
>>65
ありがとうございます
define_finalizerってやつ使うか…と思っていたのですが
syslogは複数ハンドルオープンできないんですね
コンストラクタで開いて開きっぱなしにする方法がそもそもマズいのでは
と思い直し
書く時だけオープンしてすぐ閉じるようにしました

68:デフォルトの名無しさん
08/04/16 01:16:29
URLリンク(www.kuwata-lab.com)

69:デフォルトの名無しさん
08/04/16 03:16:58
正規表現を使ったディレクトリの再帰コピーってどうしたらいいですか?
Dir.globはワイルドカードしか使えないので困ってます

70:デフォルトの名無しさん
08/04/16 04:04:40
再帰関数作ればいい。

71:デフォルトの名無しさん
08/04/16 07:02:43
Dir.glob("**/*")の戻り配列をgrepして処理すれば。
あ、再帰じゃねーや(w

72:デフォルトの名無しさん
08/04/16 07:56:03
>>69
1. FileUtils.cp_r を参考にする
2. Find.find {|path| do_somthing_with(path)}
3. Dir.open {|dir| dir.each {|entry| do_somthig_with(entry)}}

……こんなもん?

73:デフォルトの名無しさん
08/04/16 14:45:54
0001.gif 0002.gif

179.gif 180.gif
に変換したいのですが。。
ぐぐって参考にしたのですがあってますか?

require 'fileutils'

$name = ARGV.shift
$ext = ".gif"
i = 0

ARGV.each do |file|
i = i + 179
$newname = $name + sprintf("&03d", i) + $ext
print "renaming " + file + " ---> "
print $newname + "\n"
FileUtils.mv(file, $newname)
end


74:デフォルトの名無しさん
08/04/16 15:05:41
>>73
require 'fileutils'

ARGV.each do |before|
# 0001.gif から拡張子 .gif を取り出す
ext = File.extname(before)
# 0001.gif からディレクトリ名を取り出す(無いので ./)
dirname = File.dirname(before)
# 0001.gif から拡張子抜きファイル名 0001 を取り出す
basename = File.basename(before,ext)
# 0001という文字列を数字にして178を足して0詰め数字3文字に
after_basename = sprintf("%03d", basename.to_i + 178)
# ディレクトリ名+数字3文字+拡張子 というファイル名に合成
after = File.join(dirname, after_basename + ext)
# リネームしまーす
puts "renaming: #{before} -> #{after}"
FileUtils.mv(before, after)
end

# 実行結果
~$ ruby rename.rb 0001.gif 0002.gif
renaming: 0001.gif -> ./179.gif
renaming: 0002.gif -> ./180.gif


75:デフォルトの名無しさん
08/04/16 15:15:53
で、

# 0001という文字列を数字にして178を足して0詰め数字3文字に
after_basename = sprintf("%03d", basename.to_i + 178)

のとこだけど、178を足してる時点で数字3文字になることはほぼ確定なんで、イマイチよくわからん
もし、0900.gif が 1078.gif にリネームされてもOKなのなら、単に

after_basename = (basename.to_i + 178).to_s

とでもしてくれ
>>74のままでも4桁動くから使用上は問題ないけどな
あと、フルパスや相対パスを引数にしてもそのディレクトリでリネームされるのでよろしく

76:デフォルトの名無しさん
08/04/16 15:23:52
ありがとう><
0001.gifから0200.gifまでとかだと
どうするとよいですか!?

0詰めは、100以下のときだけですね^^;

77:デフォルトの名無しさん
08/04/16 15:30:19
適切なファイル名を200個作って引数を200個渡す
以上

どこにどんなファイルがあるか知らんのでこれ以上はどうにもならん
汎用的な条件つけて頼めばもう一回くらいは誰か作ってくれるかも
引数として指定されたディレクトリのファイルを全てリネームするとか

78:デフォルトの名無しさん
08/04/16 20:46:32
シェル呼び出しの時間を計るにはどうしたらいいですか?
Benchmark.measure { `sleep 10` }
これだと何故か実行時間が0になってしまうのです

79:デフォルトの名無しさん
08/04/16 21:55:08
その間自プロセスはwaitしてるだけだから時間が掛かってないってことだよね。

tms = Benchmark.measure { `sleep 10` }
tms.real #=> 10.0072751045227

あと、``は結果を文字列で得たいときに使うものだから、system 'sleep 10'
のほうが行儀がよいと思う。


80:デフォルトの名無しさん
08/04/16 21:59:04
ていうか
irb> Benchmark.measure { `sleep 10` }
#<Benchmark::Tms:0x401fae88 @utime=0.0, @cstime=0.0, @total=0.01, @cutime=0.01, @label="", @stime=0.0, @real=10.0146338939667>
これは妥当だと思うんだけど
というか user time や system time の違いってわかってもらえてるのかな

81:デフォルトの名無しさん
08/04/16 22:15:13
「たぶんtotalだけみとけばいいんだな」くらいの理解だと思われる。


82:デフォルトの名無しさん
08/04/16 22:33:13
>>76
ruby 連番 rename あたりでググると吉。


83:デフォルトの名無しさん
08/04/17 02:45:11
>>50
初めて見たんだがそれ有名なのか?

84:デフォルトの名無しさん
08/04/17 05:28:30
Rubyってタイプヒンティングやインターフェイスがないですが
引数にある型のオブジェクトが欲しい場合、
どうするのが普通ですか?

85:デフォルトの名無しさん
08/04/17 07:11:30
>>84
お好きなのをどうぞ
* ダックタイピングを実践する
* 自分で引数を解析し例外送出などの処理を記述する
* Sapphireがリリースされるのを待つ
* いつかrubyに実装されるのを待つ
* PHPを使い続ける

86:デフォルトの名無しさん
08/04/17 07:26:32
プログラミングRubyのダックタイピングの項を読み直してみました
ダックタイピングというのは
引数リストでフィルタせず、メソッドがあるものと前提して呼び出し、
ないときには発生する例外によってコーディングの間違いを知る
といったスタイルですね
基本ダックタイピングで、
厳格にしたいケースではメソッドの有無をたしかめる
といったあたりが現実的なところでしょうか・・

87:デフォルトの名無しさん
08/04/17 07:46:22
テンプレートメソッドを
継承でするか、mixinでするかの判断基準は
何でしょうか?

88:デフォルトの名無しさん
08/04/17 10:24:10
>>83
試してみるといい
まあ、Mechanizeしたいと考えるようなページなんて大体決まってるってことなんだろうな
引っかからない人は全く引っかからないバグだ、これ

89:デフォルトの名無しさん
08/04/17 10:32:00
>>87


いやマジで
どっちも「使ったから便利明快になる」というものではない
(サンプルコードでは明快だけどな)
継承を試してわけわかめだったらmix-in用に思考を切り替えるのが一般的かもしれん

90:デフォルトの名無しさん
08/04/17 10:42:07
>>87
テンプレートメソッドパターンとかはまず置いといて、継承が妥当か否かだったら
こんなんがあるな。
URLリンク(jp.rubyist.net)

Mixinとか委譲のおかげでRubyでは比較的あんまり継承しない気がするのは俺だけ?

91:デフォルトの名無しさん
08/04/17 11:00:55
どんだけ注意深く作る(作らなければならない)かの話だな
private を書くかどうかに似た話

92:デフォルトの名無しさん
08/04/17 15:31:03
privateとか何のためにあんの?
使わないメソッドなんて使わないんじゃね?

93:デフォルトの名無しさん
08/04/17 15:39:49
>>92
うん、まあ、君の感覚はある意味正しい
ある一定規模未満の素朴なプログラムでは単にめんどくさいだけとも言える
「グローバル変数が危険とか言うけど変数の場所とか名前とか被らないようにしておけば問題なくね?」
という問題と根っこは一緒だ

94:デフォルトの名無しさん
08/04/17 17:15:17
>>77
*.gifとかならできそうですかね。ありがとうございました!

95:デフォルトの名無しさん
08/04/17 17:18:11
引数を()で囲まない
Class.method arg
という書き方をした時に、
「この書き方は今後のRubyではサポートしない可能性がある」というような
警告が出る時と出ない時がありますが
これはどういう時に出るのですか?

96:デフォルトの名無しさん
08/04/17 17:29:31
>>95
URLリンク(blade.nagaokaut.ac.jp)
> 具体的には
> 引数として与えるメソッド呼び出しの括弧を省略しない
> ということです。文法的に値と文の区別をはっきりさせようという
> 思いです。

っていうか関数型メソッド以外ではカッコ省略する必要ないじゃんという気はする
あとRiteって今で言うところのRuby2.0のことね

97:デフォルトの名無しさん
08/04/17 18:25:10
>>96
ありがとうございます
マッツの設計思想はわかりますが
引数が一つの時は()書きたくないですね
この警告抑制したりできるのでしょうか

98:デフォルトの名無しさん
08/04/17 18:27:43
ruby -W1 hoge.rb
もしかしたら W0 でないとダメかもしれん

99:デフォルトの名無しさん
08/04/17 18:54:52
eachのブロックの中からループのカウント数を知る方法があれば教えて下さい。

100:デフォルトの名無しさん
08/04/17 18:57:08
つ each_with_index

101:デフォルトの名無しさん
08/04/17 19:05:36
数値をゼロパディングする方法は

printf("%010",NUM)
以外にないですか?


102:デフォルトの名無しさん
08/04/17 19:12:44
number.to_s.rjust(width, "0")

103:デフォルトの名無しさん
08/04/17 19:19:02
>>100
こんな便利なものが
ありがとうございました

104:デフォルトの名無しさん
08/04/17 20:24:07
文法的なエラー、
たとえばendが足りなかったりすると
ファイルの最後の行を指示してエラーが出たりします。
変更箇所が多かった場合、どこで間違えたか分かりにくいです。
どこで間違えているかすぐにわかる方法があれば教えて下さい。

105:デフォルトの名無しさん
08/04/17 20:51:58
ruby/sdlをつかってプログラムを作ろうと思っているのですが
常に最前面に表示し続けることは可能でしょうか?

106:デフォルトの名無しさん
08/04/17 21:02:48
>>102
ありがとう神様

107:デフォルトの名無しさん
08/04/17 21:10:49
>>104
ブロックの開始と終了の知識を確実にした上で、
ブロックをインデントしてくれるエディタを使う
インデントが大きくなるべきでないところで大きくなってるところがあれば
そこが閉じ忘れ
同様に "" や '' や () の対応を表示してくれる(色分けしてくれる)エディタを使うと
多くの場合「閉じ忘れ」がすぐ見つかるというか閉じ忘れることがない

あと ruby -c ./hoge.rb とすると文法チェックだけをしてくれる
自信ないなら中規模な変更ごとにチェックしてもらうといい

108:デフォルトの名無しさん
08/04/17 21:24:31
>>105
たぶん不可能

ちなみにRuby/SDLの話なら、ゲーム制作スレの方がいい
スレリンク(gamedev板)

109:デフォルトの名無しさん
08/04/17 22:12:21
>>107
エディタのインデントは完全ではないから、ちょっと複雑になるとあてにならないよ。
Rubyの文法は複雑だから、エディタごときが完全にパースできるわけではない。
だからエディタに任せてもendの閉じ忘れは検出できないことがよくある

110:デフォルトの名無しさん
08/04/17 22:15:27
>>104
・classやmoduleの閉じ忘れ
最初に書け。
・defとかその中のifとかの閉じ忘れ
メソッドでけぇ。

対処法にあんまなってないけど考え方としてはこんな感じかなぁ。

111:デフォルトの名無しさん
08/04/17 22:16:11
>>109
出たな100パーセント厨
口癖は「それは完全ではない」
90パーセントの達成度の価値を認めない人間だ

112:デフォルトの名無しさん
08/04/17 22:27:51
90パーセントかどうかはともかく、8割くらいはエディタの自動インデントで見つかるよな

エディタとして何を使ってるかとRuby編集モードの出来に依存するのが難点か
Emacsのruby-modeはわりと優秀

113:デフォルトの名無しさん
08/04/17 23:31:12
>>104
URLリンク(www.logic-junction.com)

patch をあてなきゃだからちょっと敷居は高いけど。

114:デフォルトの名無しさん
08/04/18 01:10:16
>>113
これよくないですか?
なんで本体に取り込まれないんだろう

115:デフォルトの名無しさん
08/04/18 01:59:32
parse.yをいじるからじゃないの。
Ruby2.0あたりではyacc捨てたいねえとか言う話もあったんじゃなかったっけ。

116:デフォルトの名無しさん
08/04/18 02:09:29
>>113
どうでもいいが、ページの上にある「Abount」に吹いた。

117:デフォルトの名無しさん
08/04/18 02:43:58
プログラミングRubyに
ブロックの記述は、一行の場合は{}
二行以上の場合はdo~endを使うのが
Rubyコミュニティーのコンセンサスだと書いてありましたが
ブロックは複数行になる場合も{}の方が視認性よくないですか?
すべてendだと、何を閉じるものなのか、頭を見ないと分かりませんが、
{}だと、閉じカッコを見るだけで
何を閉じているのかがだいたい推測つきますし。
endにする合理的理由ってあるのでしょうか?

118:デフォルトの名無しさん
08/04/18 02:56:59
主観的な問題

119:デフォルトの名無しさん
08/04/18 03:06:49
・whileやifとの統一性
・だいたいソースは上から読む>何を閉じるものなのか、頭を見ないと分かりません
・Hashリテラルだって}で閉じるし、%{...}文字列リテラルなんかもある

でも結局は>>118か。

120:デフォルトの名無しさん
08/04/18 04:50:55
end地獄が大嫌いだからdo~endなんか絶対に使わない

121:デフォルトの名無しさん
08/04/18 06:09:35
ってか、
そもそもなんでendなの?
文と紛らわしいしタイプも面倒くさい。
Rubyの最大の欠点がend。

122:デフォルトの名無しさん
08/04/18 06:48:00
}地獄が大嫌いだから(複数行で){}なんか絶対に使わない

>>121
主観的な問題

123:デフォルトの名無しさん
08/04/18 06:56:24
主観で片付けるのはおかしいよ
文と紛らわしいのも、タイプ数が多いのも
定量的な問題じゃん
理性的な判断を下せる範疇にあるはずだよ

124:デフォルトの名無しさん
08/04/18 07:49:21
     end
    end
   end
  end
 end
end

125:デフォルトの名無しさん
08/04/18 07:52:02
主観的な問題でないのなら
なぜ「do~end超読みやすい! すっきりする」って人と
「do~end読みにくい上に紛らわしすぎ」って人とに分かれるんだ

126:デフォルトの名無しさん
08/04/18 08:04:48
だって引数の記述と通常の文との違いを明確にしたいmatzだよ
その認識の延長線上には、文と紛らわしいendの否定があるはずなんだよ
endをすぐに完全に廃止しろとは言わない
試しに{}も許容するようにしたらいいんだよ
コストはそんなに高くないだろう
その小さな変化は
きっと世界中の開発者に歓迎されると思うよ。

127:デフォルトの名無しさん
08/04/18 08:07:12
・yaccの能力で、beginとcaseの文法が上手く纏められなかった
・endを使うとruby-mode.elが書けそうだった
こんな理由じゃなかったっけ。

ifやwhileのこと?
>試しに{}も許容するようにしたらいいんだよ

128:デフォルトの名無しさん
08/04/18 09:04:24
endでいいと思うけど、emacsとかで
対応するclass,def,if,forにジャンプする
機能って無いですよね?

129:デフォルトの名無しさん
08/04/18 09:16:27
>>128
あるなら俺も使いたい。
{} の方ならこれでジャンプできるけどな。

URLリンク(www.bookshelf.jp)
;; By an unknown contributor
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
((looking-at "\\s\)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))

(global-set-key "%" 'go-to-paren)

130:デフォルトの名無しさん
08/04/18 09:43:04
M-x ruby-beginning-of-block

131:デフォルトの名無しさん
08/04/18 09:44:51
あ、>>130は「このブロックの最初」にカーソルを移動な
カーソル移動がめどいという場合には妥当な機能

132:デフォルトの名無しさん
08/04/18 09:55:22
ああ、キー操作あった
C-M-p
ちなみに {} のブロックでも有効
ただ、厳密には「インデントつける」計算上のブロックの最初に移動する
だから、

File.open('hoge.txt'){|f|
f.puts data
}

の場合は { ではなく File の F に移動する

File.open('hoge.txt'){|f| f.puts data }

の場合は検知できなくて、「ひとつ上」のブロックの最初に移動する

133:デフォルトの名無しさん
08/04/18 11:06:13
end は予約語だから、Rubyスクリプトを読んでるという頭の中では何かと間違えることはないなあ
(むしろ bashスクリプトで doneではなく endと書いて動作不良に首を傾げる)
慣れと主観っちゃそのとおりだがそれはそれで台無しな意見だ(w
素直に着色なエディタを使うというのはどうだろう

134:デフォルトの名無しさん
08/04/18 17:11:08
モジュールの中で、
自分を読み込むクラスに実装を期待するメソッドを定義あるいは明示するには
どうしたらいいですか?

135:デフォルトの名無しさん
08/04/18 17:19:34
まにゅあるに「hogeとhageはつくってね」とかく

136:デフォルトの名無しさん
08/04/18 17:28:37
え・・
Javaでいうabstractみたいな方法はないのでしょうか

137:デフォルトの名無しさん
08/04/18 17:46:52
def hoge
 raise "override me!"
end

138:デフォルトの名無しさん
08/04/18 17:46:54
実行中にメソッドを追加したり削除したりできるRubyではそもそも無理
別途ユニットテストとかでソースコード自体を検査させるべき

139:デフォルトの名無しさん
08/04/18 17:47:05
こういうのとか?
URLリンク(blade.nagaokaut.ac.jp)

140:デフォルトの名無しさん
08/04/18 18:39:10
The Ruby Way 第2版
URLリンク(www.amazon.co.jp)
おおむね今週に発売(たぶんたいていの本屋に並んでるはず)
ボリュームアップし過ぎて5千円札では足りなくなりました

141:デフォルトの名無しさん
08/04/18 19:09:25
結局実行時だけど、自分はこうしてる
 def foo
  bar
 end

private
 def bar
  raise NotImplementedError
 end

142:デフォルトの名無しさん
08/04/18 19:14:58
モルボル教だかのお布施額がアップしたんだろ

143:デフォルトの名無しさん
08/04/18 19:20:36
def SomeModule.included(klass)
 raise unless klass.method_defined?(:foo)
end
とかやればいいんじゃね?

144:デフォルトの名無しさん
08/04/18 19:20:54
19種類のRubyテンプレートエンジンレビュー
Mini reviews of 19 Ruby template engines
URLリンク(www.hokstad.com)

19種類ってありすぎww

145:デフォルトの名無しさん
08/04/18 19:23:31
実行時にエラーが出るというのは致命的
実際にそのメソッドが使われないと、未定義かどうかのエラーが出ないんだからね

それこそ、めったに起きないエラー処理のメソッドだった場合は、
まともに動作して安心してた頃になって致命的なことになる

ソフトウェアテストでチェックすることをお勧めするよ

146:105
08/04/18 19:26:28
>>108
ありです

147:デフォルトの名無しさん
08/04/18 19:28:13
>>140
翻訳が変わってるのがすごく気になるな・・

148:デフォルトの名無しさん
08/04/18 19:39:37
rubyはスペルミスがあってもそのまま動きますから、小さいことは気にしませんw

149:デフォルトの名無しさん
08/04/18 19:48:44
>>147
同じく
クイープの翻訳は最近アテにならないからなあ

150:デフォルトの名無しさん
08/04/19 00:00:08
Ruby初心者ですアドバイスよろしくお願いします。
.txtファイルに書かれた半角スペースで区切られた単語郡を
それぞれ配列に格納するスマートな方法があればお教えいただけないでしょうか。
汎用性を持たすために、ファイルの読み込みは
ruby test.rb < gomi.txt
にしたいです。
windowsXP ruby1.8.6

151:デフォルトの名無しさん
08/04/19 00:07:20
つsplit

152:デフォルトの名無しさん
08/04/19 00:10:48
a bb ccc
dddd eeeee ffffff ggggggg

というようなテキストだと仮定
「それぞれ」という言葉から、1行目の配列と2行目の配列は別だと推測
ruby test.rb < hoge.txt
でも
ruby test.rb hoge.txt
でも動作する

# 配列を格納する配列
all_arr = Array.new
# readlines は 引数のファイル、無ければ標準入力から読み込んで各行を配列にして返す
readlines.each do |line|
# chomp で line を区切って配列にする
# 区切る"文字"は 正規表現の / / にマッチするものつまり半角スペース1個
arr = line.chomp.split(/ /)
# push メソッドで arr を all_arr の要素の末尾に追加する
# all_arr を「長くする」のではないことに注意
all_arr.push(arr)
end
# all_arr の中身を表示
p all_arr

153:150
08/04/19 01:40:27
150です。早々の回答を有難うございました>151,152
二次元配列のような形にしたかったので、152さんのおっしゃるとおりです。
配列の値をActiveRecordでsqlに挿入しようと思っていました。
本当に助かりました、有難うございました。

154:デフォルトの名無しさん
08/04/19 05:12:28
スキルレベルの微妙なちぐはぐさ加減が怖い

155:デフォルトの名無しさん
08/04/19 06:21:48
emacsをruby-modeで使っています
この環境で定義済みクラスやメソッドのリストを見たり、
定義済みのメソッドを自動補完させたりすることは出来ますか?

156:デフォルトの名無しさん
08/04/19 18:18:04
mixinとコンポジットの使いわけがよく分かりません
mixinがないほとんどの言語では、mixin的なことはコンポジットで実現しますよね
どういう時にmixinを使うんですか?

157:デフォルトの名無しさん
08/04/19 18:22:53
mixin は mixin 先の実装に依存した実装を追加したい時に使う。

158:デフォルトの名無しさん
08/04/19 19:44:38
ファイルパスから親ディレクトリを取得するにはどうしたらいいですか?

159:デフォルトの名無しさん
08/04/19 19:47:52
>>158
File.dirname(file_name)


160:158
08/04/19 20:01:35
DirとかFileUtilsばかり見てました
ありがとうございます


161:デフォルトの名無しさん
08/04/19 20:05:51
ライブラリのクラスメソッドを使う場合に
それを後に書く方法があれば教えてください
たとえば
File.dirname 'hogehoge'

'hogehoge'.(File.dirname)
みたいな形で書きたいんです

162:デフォルトの名無しさん
08/04/19 20:10:40
>>161
そうですか

163:デフォルトの名無しさん
08/04/19 20:15:50
どっかでそんな後置の言語を見た気がする
仮にRubyで実現するとしても、それを繋ぐのは . ではないだろうな

164:デフォルトの名無しさん
08/04/19 20:22:51
気持ち悪いと思わないなら
class String
def dirname
File.dirname(self)
end
end

あとはpathnameというライブラリもある。


165:デフォルトの名無しさん
08/04/19 20:38:34
というか何のためにそうしたいのかによるな

166:デフォルトの名無しさん
08/04/19 21:08:19
class Object
 def callback(method, mypos=0, *args)
  args.insert mypos, self
  method.call *args
 end
end

p Math.sqrt(400)
#=> 20.0
p 400.callback Math.method(:sqrt)
#=> 20.0

p [1,2,3,4,5,6][2,3]
#=> [3, 4, 5]
p 3.callback([1,2,3,4,5,6].method(:[]), 1, 2)
#=> [3, 4, 5]

こんなもんでどうかな

167:166
08/04/19 21:09:58
上のは >>161


168:デフォルトの名無しさん
08/04/19 21:46:47
>>165
クラスとオブジェクトとメソッドの理解がまだ足りないんだと思う
気持ちはわかるが考え方が不当

欲しいのはいわば pathenize_dirname メソッドと推測

p '/usr/local/bin/ruby'.pathenize_dirname
"/usr/local/bin/"

メソッドの引数形式を「カッコ悪い」と感じる時期に罹るハシカみたいな病気だ

169:デフォルトの名無しさん
08/04/19 22:30:45
え、>>161は見た目が気に入らないというだけ?
機能的な話かと思ったら、どうやら明後日を向いていたようだ。
そういうことであれば >>166>>161の美意識には適うまい。

170:デフォルトの名無しさん
08/04/19 22:33:10
こんなのもありか。

class String
def to_path
Pathname(self)
end
end

p '/usr/local/bin/ruby'.to_path.dirname


171:デフォルトの名無しさん
08/04/19 22:33:40
いや、pではto_strは呼ばれないな。putsで。


172:デフォルトの名無しさん
08/04/20 15:48:07
ERBについて教えてください。
railsのテンプレートでERBが使われてますが、
これは何かのタイミングで一度rubyのクラスに変換されてからHTMLに再び変換されるのでしょうか?
例えばJavaのJSPがJSP→サーブレット→HTMLと変換されるのと同じ流れですか?

173:デフォルトの名無しさん
08/04/20 16:05:58
>>172
<%%>の中身がそのままRubyコードとして抜き出され、
それ以外は_erbout.print ... という形に変換されてから
Rubyで評価される感じです。


174:172
08/04/20 16:30:00
>>173
なるほど、jspみたいにrhtmlファイルがクラスに対応するわけではないんですね。
あまり綺麗な仕組みではないですね…。
ありがとうございました。

175:デフォルトの名無しさん
08/04/20 16:31:52
単純に、ERBの簡単な使い方勉強するとイメージしやすいと思うよ
eRubyの仕様じゃなくて、ライブラリの使い方ね

176:デフォルトの名無しさん
08/04/20 17:47:33
mixiの「メッセージ」を送信したくて、URLリンク(d.hatena.ne.jp)を参考にして、以下のように書いてみました。
基本的にeditの部分だけを変更し

def edit title, content
@id = "12345"#相手のid
@edit_page = @agent.get('URLリンク(mixi.jp)'+@id)
edit_form = @edit_page.forms.name("messageForm").first
edit_form['subject'] = title.toeuc
edit_form['body'] = content.toeuc
confirm_page = @agent.submit(edit_form)
conf_form = confirm_page.forms[0]
p @agent.submit(conf_form)
end


以下を実行しました。

def mixi_message
mdw = MixiMessage.new("hoge@hoge.com","hogehoge")
mdw.login
mdw.edit "テストタイトル", "テスト本文"
end

177:デフォルトの名無しさん
08/04/20 17:48:07
結果、次のような出力になり、メッセージは送信されていませんでした。

#<WWW::Mechanize::File:0x4b03cdc @response={"connection"=>"close", "date"=>"Sun,
20 Apr 2008 08:11:37 GMT", "x-dealer"=>"034093", "content-type"=>"text/plain; c
harset=euc-jp", "server"=>"Apache", "content-length"=>"0"}, @code="200", @uri=#<
URI::HTTP:0x2583fc0 URL:URLリンク(mixi.jp) @filename="s
end_message.pl", @body="">


送信できていない原因は何でしょうか?

178:デフォルトの名無しさん
08/04/20 17:49:28
結果、次のような出力になり、メッセージは送信されていませんでした。

#<WWW::Mechanize::File:0x4b03cdc @response={"connection"=>"close", "date"=>"Sun,
20 Apr 2008 08:11:37 GMT", "x-dealer"=>"034093", "content-type"=>"text/plain; c
harset=euc-jp", "server"=>"Apache", "content-length"=>"0"}, @code="200", @uri=#<
URI::HTTP:0x2583fc0 URL:URLリンク(mixi.jp) @filename="s
end_message.pl", @body="">


送信できていない原因は何でしょうか?

179:デフォルトの名無しさん
08/04/20 18:16:00
>>176
WWW::Mechanizeは実際にサーバから送られてきたHTMLから指定された要素を抽出して実行している

素直に読むと

URLリンク(mixi.jp)ユーザーIDというページの結果を取得し、
<form name="messageForm"> というフォームで1番最初にあるフォーム中にある、
<input name="subject"> という、type が text か何かの入力欄に引数titleの内容を日本語EUCで入力
<input name="body"> という、type が text か何かの入力欄に引数contentの内容を日本語EUCで入力
<form name="messageForm"> のsubmit ボタンを「押して」結果のページを取得する
取得した結果の中の最初の <form> の submit ボタンを「押して」結果のページを取得する

という処理なんだけど、mixiのページ構成はきちんとそのようになってるかい?

180:デフォルトの名無しさん
08/04/20 18:55:48
176です。お返事ありがとうございます。
p conf_form
としてみたところ、出力に

#<WWW::Mechanize::Form::Field:0x4ba0de8 @name="submit", @value="confirm">

があり、これは、
「確認画面」の <input type="hidden" name="submit" value="confirm"> と一致しているので、
おそらく「確認画面」までは到達していると思います。

「確認画面」では formはひとつしかなく、

<form action="send_message.pl?id=1056392" method=post>
<input type="hidden" name="submit" value="confirm">
<!--略-->
<input name=yes type=submit value=" 送 信 ">
<!--略-->
<input name=no type=submit value=" 修 正 ">
</form>

という構成になっており、submitが二つあるのが怪しいかなと思っているのですが、
指定のない場合は、先にある「送信」が押されると思うので、条件は満たしているような気がします。
ほかに問題となりそうな点は何でしょうか?

181:デフォルトの名無しさん
08/04/20 20:37:02
num++
みたいな書き方が他言語とは挙動が異なるみたいなんですが
これはどういう動作をしているのでしょうか?

182:デフォルトの名無しさん
08/04/20 20:47:58
そもそも ++ はないよ

183:デフォルトの名無しさん
08/04/20 20:48:11
rubyにそんな演算子は存在しない

184:デフォルトの名無しさん
08/04/20 23:54:38
>>182-183
ありがとうございました
なんでないんでしょうね?
実装も単純そうなのになぁ

185:デフォルトの名無しさん
08/04/21 00:08:05




説明するの面倒なのでぐぐってくれ
インクリメントの実装自体は簡単なんだが、Rubyのほうそくが みだれる ので採用されない

186:デフォルトの名無しさん
08/04/21 00:12:19
かっちょええ説明法があればたぶん普通に採用されると思う
さあ頑張って
「自分を破壊し別のオブジェクトを生み出して置き換える」
メソッドの意味を説明して説得するんだ

187:デフォルトの名無しさん
08/04/21 00:18:12
モルモン教義的に不死がタブーでないのなら
Rubyでベニクラゲをモデリングしたいと言ってみる

188:デフォルトの名無しさん
08/04/21 00:23:36
ループが正常に実行した時にのみ、ある処理を実行する
というプログラムを美しく書く方法があれば教えてください。
フラグを用意し、ループを抜けてからフラグをチェックするのが
普通だと思いますが、フラグの存在が冗長な気がします
例外を使うのも、何かやりすぎのような気がします

189:デフォルトの名無しさん
08/04/21 00:56:43
do_this if array.all? {|x| ... }
とかじゃなく?


190:デフォルトの名無しさん
08/04/21 03:20:44
どこでもrescueされなかった例外を補足するには
どうしたらいいですか?

191:デフォルトの名無しさん
08/04/21 03:27:37
rescue すればいい

192:デフォルトの名無しさん
08/04/21 03:56:54
全体を囲む大きなbeginブロックを書くということですか?
視認性が悪くなるので、
前もってエラーハンドラみたいなものが登録できたらいいと思うのですが・・

193:デフォルトの名無しさん
08/04/21 04:07:33
基本的には処理はトップレベルにベタ書きすべきじゃないと思うから
(変数はなるべくローカルスコープに入れた方がいいので)、
C などの main 関数みたいに全ての処理を囲んだ関数を作って
トップレベルに記述する処理はその関数のみにしておくと良い。
そういう状態であれば、begin で囲むのもそこだけで済む。

194:デフォルトの名無しさん
08/04/21 04:18:35
ふーむなるほど…
ありがとうございました

195:デフォルトの名無しさん
08/04/21 06:16:46
Timeオブジェクトを引き算するとfloatが返ってきます
時間の差をあらわすオブジェクト(間隔オブジェクト?)が
返ってきて欲しいのですがどうしたらいいですか?

196:デフォルトの名無しさん
08/04/21 07:44:30
>>196
返って来たFloatがその間隔オブジェクト(秒.マイクロ秒)
欲しい単位が分なら (t2 - t1).to_i / 60 すればいい

197:デフォルトの名無しさん
08/04/21 10:59:01
>>186
代入演算子の一種として実装すればよい
例:a += 1

198:デフォルトの名無しさん
08/04/21 21:39:36
このへんを蒸し返してみたら?

URLリンク(blade.nagaokaut.ac.jp)


199:デフォルトの名無しさん
08/04/21 22:23:48
num++に問題があるというより
++numとnum++の挙動の違いをRubyの中に組み込むのに難があるという感じ?

200:デフォルトの名無しさん
08/04/21 22:32:18
succはあるんだから、前置++は構文だけの問題だね
後置は……


201:デフォルトの名無しさん
08/04/21 22:42:48
> succはあるんだから
ほほう
君のRubyでは
3.succ
として 3が 4になるのか?

202:デフォルトの名無しさん
08/04/21 22:43:01
馬鹿ばっかだな
演算子で終わることに自体に問題があるんだろ

203:デフォルトの名無しさん
08/04/21 22:45:52
>>201
ああ、succはsucc!じゃないよね
吊ってきます


204:デフォルトの名無しさん
08/04/21 22:59:58
で、誰が演算子で終わることを問題にしてるの?

205:デフォルトの名無しさん
08/04/21 23:51:33
Cだと 1++ で 1 が 2 になるのか。
おもしろいな

206:デフォルトの名無しさん
08/04/22 00:02:31
演算子で終わることの意味も分からない馬鹿がいるな

207:デフォルトの名無しさん
08/04/22 00:16:53
演算子で終わる云々なんて、この何回もループした議論の中で出てきたっけ?
そりゃ内部仕様は変えなきゃいかんだろうが、「演算子で終わったら駄目」な理由は?
というか採用されても、「特殊なメソッド」以上のものにはならんと思うが

208:デフォルトの名無しさん
08/04/22 00:17:20
RubyでCGI作ってみてるのですが、system(id root)とかのコマンド結果が
どうもHTTPヘッダーとして出力されてしまっているようです。

どうにか出力しない方法ってあるんでしょうか。

209:デフォルトの名無しさん
08/04/22 00:18:59
パイプ使って、標準出力/エラー出力を捨てとけ。

210:デフォルトの名無しさん
08/04/22 00:23:10
>>209
ありがとです。

211:デフォルトの名無しさん
08/04/22 01:48:37
DBIを使ってPostgresSQLと接続しようとしたのですが、上手くいきません。
環境は、
OS CentOS 5.1 64bit
Postgres 8.3.1
ruby-1.8.6-p114
ruby-postgres-0.7.1
dbi-0.2.0
です

接続しようとすると`load_driver'エラーが出ます。ruby-postgresだけだと接続出来るのですが、dbiだと駄目です。
ちなみにdbiのインストールオプションはruby setup.rb config --with=dbi,dbd_pgでインストールしました。

$ irb
irb(main):001:0> require "postgres"
=> true
irb(main):002:0> PGconn.connect("localhost", 5432, "", "", "testdb","user","wassword")
=> #<PGconn:0x2aaaaabaceb0>
irb(main):003:0> require "dbi"
=> true
irb(main):004:0> DBI.connect("dbi:postgres:testdb:localhost", "user", "wassword")
DBI::InterfaceError: Unable to load driver 'postgres'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:352:in `load_driver'
from /usr/local/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:282:in `load_driver'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver'
from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect'
from (irb):4
from (eval):3

よろしくお願いします。

212:デフォルトの名無しさん
08/04/22 02:42:51
広くメソッドというもの自体をオーバーライドすることは出来ますか?
メソッドすべてにフックを仕込んで、メッセージのやりとりを
ロギングしたり、そういうことがしたいんですが

213:デフォルトの名無しさん
08/04/22 02:51:19
URLリンク(doc.loveruby.net)

214:212
08/04/22 03:04:54
>>213
こんな機能があったんですね
ありがとうございました

215:デフォルトの名無しさん
08/04/22 03:21:12
RubyWay読んでたら、Stringのeachは1.9ではなくなり、
each_lineを使うようになったと書いてありました。
今書いてるスクリプトには、ファイルからの読み込み処理等で
eachが結構あります。
これは書き換えないと1.9以降では動かなくなるのでしょうか?

216:デフォルトの名無しさん
08/04/22 06:46:11
ハッシュの存在しないキーを参照してもnilが返ってくるだけでノーエラーですが
多次元配列で存在しないキーを参照すると
undefined method `[]' for nil
になります
存在しなかったとしてもエラーが出ないように参照する方法を
教えて下さい

217:デフォルトの名無しさん
08/04/22 07:11:08
def nil.[](i)
nil
end

218:デフォルトの名無しさん
08/04/22 07:42:47
ハッシュのデフォルト値を[]にするとか

219:デフォルトの名無しさん
08/04/22 08:03:40
あ、スマンぼけてた。問題は配列のほうか。

220:デフォルトの名無しさん
08/04/22 08:16:16
多重ハッシュでも存在しないキー指定したら
undefined method `[]' for nil
になるじゃん

何をしたいか明確に書けよヴォケ

221:デフォルトの名無しさん
08/04/22 10:20:15
>>216
配列じゃなくてハッシュを使う

222:デフォルトの名無しさん
08/04/22 11:25:06
多次元配列などというものはRubyには存在しません

223:デフォルトの名無しさん
08/04/22 13:57:40
class TajigenHairetsu << Hash
def [](*arg)
super(arg)
end
def []=(*arg)
super(arg[1,-1], arg.last)
end

224:デフォルトの名無しさん
08/04/22 17:41:56
rubyのコマンドからファイルの有無を確認する方法は無いでしょうか?
無ければ指定したテキストファイルを作り
あれば追記するような仕組みを持ちたいので

225:216
08/04/22 17:50:19
217さんの方法でしのぐことにしました
ありがとうございました
>>220
ハッシュか配列かではなく
nilに[]が使えないことをどうしようかという話でした

226:デフォルトの名無しさん
08/04/22 18:17:46
>>224
ファイルのことについてどうこうしたいんだからFileクラスのメソッド探してみれ

227:デフォルトの名無しさん
08/04/22 19:31:56
だからfetch(i,default)を使えと

228:デフォルトの名無しさん
08/04/22 20:24:49
問答無用に'a'でopenすればええんとちゃうの?

229:デフォルトの名無しさん
08/04/22 21:04:12
>>228
のぞんでいたどうさができました
おそらく不具合の原因は参考にしていたサイトがafile=File.new(*****)
とnewを使っていたためのようです
今まで5個ほど言語を学んできましたがrubyほどシンプルで強力な言語は
無いと感じました
本当にありがとうございます!

230:デフォルトの名無しさん
08/04/22 21:28:45
>>215

動かなくなるよ。
str.each は、str.scan(/^/).each に置き換えよう。


231:デフォルトの名無しさん
08/04/22 21:42:21
IO#eachは残ってるんじゃなかったっけ?

232:デフォルトの名無しさん
08/04/22 22:15:01
class String
 unless method_defined?(:lines)
  def lines
   self
  end
 end
end

としておいて、1.8系でもstr.lines.eachと書いておくという手も…

233:デフォルトの名無しさん
08/04/22 23:06:52
irb > print "test"
この結果が
ttt => nil
と出るんですが、これはどういう意味なんですか?

irb => ttt
と出力されることを期待したのですが。

234:デフォルトの名無しさん
08/04/22 23:09:48
tttはtestのつもり?
irbの=>の後ろに出るのは、入力した式(print "test")を評価した値。
x= print "test"
とすると x = nil になるのといっしょ。

testという文字列が書き出されるのは式の評価(値を求めること)の、まぁ副作用だ。


235:233
08/04/22 23:38:04
>>234
おぉ丁寧にありがとうございます。
入力コマンドを単純に実行するのではなく評価するだけなんですね。
てか使い道あるんでしょうかね…?

236:デフォルトの名無しさん
08/04/23 00:34:45
ないよ

237:デフォルトの名無しさん
08/04/23 00:37:12
irb > print "test"
この結果が
ttt => nil
^^^~~~~~~
^:printの出力
~:irbが返り値のインスペクションを出力

コマンドって…

238:デフォルトの名無しさん
08/04/23 00:43:07
ttt => String
にはならんの?

239:デフォルトの名無しさん
08/04/23 00:51:04
たぶん出力の意味を勘違いしてるよ。
irbは「=> 返り値」を印字してるだけ。
その前のprintの出力に改行がないからそんな見た目なだけ。
もしそんな出力がされるってことは、printがStringクラスを返してるというイミフなことになるぞ。

240:デフォルトの名無しさん
08/04/23 06:24:22
RubyのIDEでおすすめは何ですか?
今はNetBeansを使っていますが、他のファイルのクラス等が
自動補完できないのでもう少し高機能なのが欲しいと思っています

241:デフォルトの名無しさん
08/04/23 09:33:10
おすすめは無い
あと1年くらいしたら便利なの出てくるぜと3年くらい前から言われてる

242:デフォルトの名無しさん
08/04/23 11:46:14
rubyらしいな

243:デフォルトの名無しさん
08/04/23 14:09:47
pythonから移ってきた人向けの入門ページとかないですか?

244:デフォルトの名無しさん
08/04/23 15:31:57
for文について質問です。

for book in book_array
end

このように配列を回すfor文の中でインデックスを取得することは出来ないのでしょうか?


245:デフォルトの名無しさん
08/04/23 15:33:59
Enumerable#each_with_index

246:デフォルトの名無しさん
08/04/23 15:53:58
>>245

ありがとうございます!できました。
java出身だとfor文でインデックス取れないって変な感じですね。


247:デフォルトの名無しさん
08/04/23 16:15:35
数値計算関係はpython
日本語処理はruby
という使い分けしようと思っててるんですが、うまくミックスする方法はないのでしょうか?

248:デフォルトの名無しさん
08/04/23 16:39:13
質問が曖昧すぎて意味不明


249:デフォルトの名無しさん
08/04/23 19:40:43
>>246
for i in (0..book_array.size)
p i, book_array[i]
end

カウンタ変数もなしにインデックスが取れるわけないだろう

250:デフォルトの名無しさん
08/04/23 20:37:16
>>249
× ..
○ ...

251:デフォルトの名無しさん
08/04/23 21:54:00
上と下ならどっちがrubyらしいですか?

if foo == ""
end

if foo.is_a? String && foo.empty?
end

252:デフォルトの名無しさん
08/04/23 22:07:13
オブジェクトの型をチェックするコードは常用するものではない。


253:デフォルトの名無しさん
08/04/23 23:04:56
>>247
全部Python

254:デフォルトの名無しさん
08/04/23 23:13:04
てかRubyの日本語処理ってNKFべっただし
PythonからRuby向けを切り出す必要があるとは思えない
Pythonで書けるなら全部Pythonで書くのがベスト

255:デフォルトの名無しさん
08/04/24 00:18:41
rubyで簡単なツールを作ろうと考えております
GUIを組むにはruby/tkとか色々種類があるようなのですが、
最もメジャーなのはどれでしょうか?

ツールの詳細としては、チェックボックスやリストで設定項目を設定し、
それによるシミュレーション結果をメッセージボックスに文字列で
順次吐き出すだけというものです

※一応Javaも少しかじってます
もし「rubyのGUIは終わってるからJavaでやれ」とかならば
それはそれで結論として構いません

256:デフォルトの名無しさん
08/04/24 00:28:07
際だって使われているGUIツールキットはないと思うが、tkは最初から
付いてくるから比較的メジャーと思われる。
自分はマカーなので、必要な場合はOSに付いてくるRubyCocoaを使う
ことになると思うけど。

Javaもかじってる人ならJRubyでSwing使うというのもアリかね。


257:デフォルトの名無しさん
08/04/24 00:31:29
>>255
FXRuby

258:デフォルトの名無しさん
08/04/24 00:35:52
railsでいいじゃん

259:デフォルトの名無しさん
08/04/24 00:38:22
>>255
URLリンク(www.gesource.jp)
おいらはApollo派


260:デフォルトの名無しさん
08/04/24 00:41:57
配布するのか、自分の特定のマシンで使うのかにもよるよな

261:デフォルトの名無しさん
08/04/24 01:00:03
漏れはRuby/Gtk2
Gnomeだからそれに合わせて。Gladeとかあって使い勝手も悪くない。

262:255
08/04/24 01:07:39
>>260
一応は仕事で補助的に使うツールです
基本は自分のPCで動けばOKですが
状況によっては周囲に配らないとも言いきれませんので
配布時のパッケージングに優れていると助かりますね



263:255
08/04/24 01:09:43
あと、OSはWindowsXPです
今更言う事でもありませんが、念の為…

264:デフォルトの名無しさん
08/04/24 01:12:18
>>255
wxRubyかFXRubyの2択だな

265:デフォルトの名無しさん
08/04/24 01:15:49
VisualuRubyはダメなのかな?
exerbでexe化もできるみたいだし。


てか、ほんと「これだ!」ってのはないと思う。

266:デフォルトの名無しさん
08/04/24 09:48:06
俺AvtiveRubyとHTA

267:デフォルトの名無しさん
08/04/24 10:24:49
HTA+ActiveScriptRubyなんて組み合わせ知ったときには
これぞ俺が今まで追い求めていたものだと直感した
GUIはHTMLで記述、中身の処理はRuby。夢のようだ

なのになんで使わなくなったんだっけ俺

268:デフォルトの名無しさん
08/04/24 13:01:03
インターフェイスはrubyになるけど中身はIEのままじゃねそれ
eachとかProcとかないんじゃ

269:デフォルトの名無しさん
08/04/24 14:45:06
>>247
>>254
xmlrpcやjsonでお互いのプログラム間で通信したらいいのかな?

270:デフォルトの名無しさん
08/04/24 17:24:55
>>255
反則っぽいけどwebrickでアプリケーションサーバを作るとか
guiとかの環境依存性も配布する必要も無い
ついでにdrbで分散処理も追加

271:デフォルトの名無しさん
08/04/25 00:47:28
>>255
>262,263の条件ならC#かJavaがいいと思う。
UNIX系でも使う可能性があるなら>264かな。

272:255
08/04/25 02:51:02
色々候補ありましたが、日本語周りに確証が欲しかったので
差し当たりVisualuRuby触ってみる事にします
皆様レス有難うございました

しかし決め手が無くて色んな種類があるという状態は
選択肢が広いとは言え、個人的には苦手だ…

273:デフォルトの名無しさん
08/04/25 04:29:00
パスが入ってる文字列のファイルセパレーター(/や\)を,
/からwindowsの\に変換するメソッドは有りますか?


274:デフォルトの名無しさん
08/04/25 05:51:48
>>273
文字の置き換えだろ?
リファレンスマニュアルでStringの項を読みなさい

275:デフォルトの名無しさん
08/04/25 23:54:28
文字列の50行目から100行目の範囲に対して、正規表現で検索をしたいのですが
今は
str.split('\n).each do |line|
cnt += 1
line =~ ~ if(50<=cnt && cnt<=100)
end
のようにしているのですが、strはかなり長い文字列なので、無駄な処理をしている気がします
もっと上手は方法はないでしょうか?

276:デフォルトの名無しさん
08/04/26 00:22:53
>>275
とりあえず、splitする必要ないでしょ

277:デフォルトの名無しさん
08/04/26 00:31:59
>>275
ややトリッキーな方法だが

target_lines = str.split($/).slice(50..100)
if target_lines then
 target_lines.each do |line|
  line =~ ~
 end
end

278:デフォルトの名無しさん
08/04/26 00:39:05
>>276-277
ありがとうございます

279:デフォルトの名無しさん
08/04/26 10:18:49
>>275

str.each_with_index do |line, cnt|
next if cnt < 49
line =~ ~
break if cnt >= 99
end

1.9なら
str.each_line.with_index

280:デフォルトの名無しさん
08/04/26 10:32:56
next unless (50..100) === cnt


281:デフォルトの名無しさん
08/04/26 12:00:36
何を無駄って考えてるかによりそう
strが巨大な配列になってるのがヤだっていうならsplitとeachは全滅だな

282:デフォルトの名無しさん
08/04/26 13:58:48
Rubyからコマンドを実行させるには、execとかsystemとかいろいろあると
思うんですけど、出力結果を文字列として取得する場合はどうすればいいんですか?

ちなみにRuby1.8.6です。

283:282
08/04/26 14:01:07
282です。
できればエラーストリームだけとれるのが望ましいです。

284:デフォルトの名無しさん
08/04/26 14:13:05
URLリンク(kazuho.exblog.jp)
>日本のオープンソース開発者の中で有名なまつもと氏のような方ですらライセンス条件について間違った解釈をしてしまうのである


ほうほう。


285:デフォルトの名無しさん
08/04/26 14:49:08
わざわざ自分のブログ宣伝して回るなよ

286:デフォルトの名無しさん
08/04/26 16:24:59
>>282
* Open3 を使う(require 'open3')
* 自分で作る(open3 は簡単だから、読んでみるといい)
* windowsでは動かないかもしれないが↓
command = 'ls /tmp'
stderr = `#{command} 2>&1 > /dev/null`

287:デフォルトの名無しさん
08/04/26 22:55:11
>>282
$stdout, $stderr を reopen して system

system のいいとこは shell を介さずに実行できるから
コマンドインジェクションを防げる。

288:デフォルトの名無しさん
08/04/27 01:40:40
単純にpopenじゃあかんの?

289:デフォルトの名無しさん
08/04/27 10:50:28
ポペン!

290:デフォルトの名無しさん
08/04/27 18:19:04
あのさ、あるクラス Foo があって、その機能強化版をつくったとき、
クラス名は何にしたらいいと思う?
AdvancedFoo とか ExtendedFoo とか考えたけど、あまりいい名前じゃないといわれた。
かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。
なんかいい名前ない?

291:デフォルトの名無しさん
08/04/27 18:26:58
追加する機能をモジュールとして作り、
Fooのインスタンスにextendで機能追加する。

↑という方法では解決できず、どうしても継承でやる必要があるなら
FooWith機能名
とか
機能ableFoo
とか。



292:デフォルトの名無しさん
08/04/27 18:30:36
Fooそれ自体に機能(メソッド)を追加するという方法もある。
あるいはモジュールとして作り、includeする。
Fooのインスタンスはどれでも追加された機能を使える。

class Foo
... # 元の定義
end

# 定義を再オープンして機能追加
class Foo
def 追加機能
end
...
end

>>291のextendする方法は、Fooクラスのインスタンス全体ではなく、
Fooの特定のインスタンスだけに機能を追加する方法。


293:デフォルトの名無しさん
08/04/27 18:32:40
クラスに二つ以上の責任があるんじゃないか?
できれば分割して名前を明示できるようにした方がいい

294:デフォルトの名無しさん
08/04/27 19:46:16
>>291,292
もとのFooは残す方向なので(ほかに継承で使っている人がいるから)、Foo自体を拡張するわけにはいかないんです

>>293
まあそうなんですけど、Rubyの大クラス主義でやっているので。
大クラス主義はたしかに便利なんだよね。既存の他のクラスのインターフェース変えなくていいし。

295:デフォルトの名無しさん
08/04/27 20:19:07
>>294
大クラス主義はキッチンシンクじゃないぞ。

>>290
> かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。
どうも行き辺りばったりの感じがするんだが。
UtilFooとでもしとけば。

296:デフォルトの名無しさん
08/04/27 20:45:31
Rmagickで書き込もうとする、もしくは書き込んだ文字列の幅と高さを求めるにはどうすれば用でしょうか?

297:デフォルトの名無しさん
08/04/27 21:48:45
>>296
ImageMagickのコマンドから推測するといい

298:デフォルトの名無しさん
08/04/28 19:42:33
Rubyの利点って何?
Javaプログラマの俺にわかりやすく説明して

299:デフォルトの名無しさん
08/04/28 19:55:52
状況も設定せずに利点を挙げろつってもなぁ。
まずは自分の疑問をわかりやすく説明しる。

300:デフォルトの名無しさん
08/04/28 20:02:49
適当な捨てプロ書くのに凄く楽。

301:デフォルトの名無しさん
08/04/28 20:09:52
>>298
君にとって利点はないと思うよ

302:デフォルトの名無しさん
08/04/28 20:37:12
気楽に楽しくプログラミングできる

303:デフォルトの名無しさん
08/04/28 20:37:35
>>301
その返し方は誤解を与えるかもな。
ほとんどの人にとって利点はないと答えたかったんだろ?

304:デフォルトの名無しさん
08/04/28 21:00:15
>>300
それあるなぁ。
ワンライナーも併せて便利

305:デフォルトの名無しさん
08/04/28 21:10:58
>>303 一人で納得してれば

306:デフォルトの名無しさん
08/04/28 21:51:50
rubyで大枠の処理を書いて、細かいところはJavaを呼び出す

307:デフォルトの名無しさん
08/04/28 22:09:01
JRubyでうんたらかんたらできる。
初期起動がかなり遅いけど。

308:デフォルトの名無しさん
08/04/28 22:36:39
Rubyの利点って何って話だけど、
それよりむしろJRubyの利点が知りたい。

309:デフォルトの名無しさん
08/04/28 22:38:33
JRubyの利点ってJavaのクラスが呼び出せるとかじゃないのかな。
これができると膨大なJavaのライブラリも使えるし。

個人的にはSwingあたりのGUIライブラリが楽に使えるとありがたい。


310:デフォルトの名無しさん
08/04/28 22:40:57
大量にあるJavaの資産が使えるのがありがたい
標準のライブラリだけで大抵のものが一揃いして、もちろん完成度も高め。Swingもあるし

311:デフォルトの名無しさん
08/04/28 22:47:59
>>309
>>310
へー、そうなんだ!
JAVA屋さんには便利なのかな

そういえばIronRubyはどうなったんだろう

312:デフォルトの名無しさん
08/04/28 22:55:35
>>308
(顧客の)サーバにRubyのバイナリを入れるのは(政治的な意味で)非常に大変だが、
Javaはデフォで入ってるので、jarを1個放り込めばよいJRubyは非常にありがたい。


313:デフォルトの名無しさん
08/04/28 23:12:25
>>312
その発想はなかった!
業務で使ってる人は大変なのね

314:デフォルトの名無しさん
08/04/28 23:40:01
>>312
これあるよねー
unzipコマンドがない客先のサーバでzipファイルを解凍しなきゃいけなくて
さてどうしようと思ってたら、jarコマンドで解凍できた。
このときはjavaすげーとおもった。

315:デフォルトの名無しさん
08/04/29 00:18:07
rubyの開発者
凄い人なんだろうけど、あらゆるruby本の監修になって名前貸すだけで稼ぎまくってるあの魂胆が嫌いだ

316:デフォルトの名無しさん
08/04/29 00:20:36
成果をねたむ足引っ張り合い好きな国民性丸出し
トイレ掃除でもしてろ

317:デフォルトの名無しさん
08/04/29 01:24:23
俺はUSBメモリにruby.exeとmsvcrt-ruby18.dllが入ってるな(他は grep sed)。
これだけでもコマンドプロンプトのお供に使えるところが好き。

Python はライブラリ無いと起動すらしないし、Perl は動くけど glob が使えねえし…。

318:デフォルトの名無しさん
08/04/29 02:03:04
監修料なんて雀の涙だろ。


319:デフォルトの名無しさん
08/04/29 02:15:01
 ヾヽヽ
 (,, ・∀・)チュンチュン
  ミ_ノ
  ″″

320:デフォルトの名無しさん
08/04/29 02:28:02
>>318
どっかの年金では図柄変更バージョンごとに1千万とからしいけど。
図柄かえるだけのバージョンが100くらいある。


321:デフォルトの名無しさん
08/04/29 03:18:35
監修料がわずかって…何を見て言ってんだ?
有名人になると筆者より儲けてるよ

322:デフォルトの名無しさん
08/04/29 03:32:49
何を見て言ってんだ?

323:デフォルトの名無しさん
08/04/29 03:38:27
どぞー
スレリンク(tech板)

324:デフォルトの名無しさん
08/04/29 06:20:24
>>317
やあ俺
シェルと好みのエディタ入れれば、簡易開発環境が出来てしまうのが便利だ

325:デフォルトの名無しさん
08/04/29 08:13:17
>>321
具体例をドゾー

326:デフォルトの名無しさん
08/04/29 09:43:14
>>321
監修するなってこと? なんで? そのメリットは?
「成功者の収入が減ると、貧乏人の俺の胸がすく」という以外のメリットを感じないけど・・・。

327:デフォルトの名無しさん
08/04/29 09:53:42
釣られんなよ、おまいら……。

328:デフォルトの名無しさん
08/04/29 10:31:38
まぁ釣りだったことにしたいだろうなぁ、このフルボッコな状況じゃ。

329:デフォルトの名無しさん
08/04/29 12:53:29
>>320
さすがに公共事業とは事情が全く異なるだろ。
そういうのはまた孫受け曾孫受けで政治家とか○暴とかの
たかり屋に流れるからその分割高だし。

330:デフォルトの名無しさん
08/04/29 13:31:36
ちょっとした質問です。



・・・忘れた

331:デフォルトの名無しさん
08/04/29 13:34:16
すいません、思いだしました!

Rubyで小物でもプログラムを書くときに、
クラス化しますか?
適当に書き下す(とは言っても100行オーバーの大きさ)場合はトップレベル関数ばりばりでも
よいと思うのですが、関数作りまくるプログラミングタイプだと、
いちいち関数化時に変数をグローバルにするのが面倒です。
また、配布とかも考えると、クラス化してライブラリとして使えるようにも、と思ってしまいます。

あなたはどうしてますか?

332:デフォルトの名無しさん
08/04/29 14:01:16
うぜぇw

333:デフォルトの名無しさん
08/04/29 14:02:37
配布を考える場合は、規模問わずほぼ確実にクラス化(モジュール化)する

配布を考えないなら、そのときどき
トップレベル関数(メソッド)から作り始めることもあれば
クラスの設計から始めることもある

ところで
>いちいち関数化時に変数をグローバルにするのが面倒です。
これはどういう意味なんだ

334:デフォルトの名無しさん
08/04/29 14:19:14
この俺がエスパーしよう!

name = gets.chomp
hello = 'ぐっもーにん'
puts "#{name}さん、#{hello}"

をメソッドにすると

def say_hello
puts "#{$name}さん、#{$hello}"
end

$name = gets.chomp
$hello = 'ぐっもーにん'
say_hello

と書かなければならなくなって面倒だとか、たぶんそういう話だ!

335:デフォルトの名無しさん
08/04/29 14:33:57
トップレベルは気持ち悪いからなんでもクラス化

336:デフォルトの名無しさん
08/04/29 14:35:08
とりあえず関数だけで書いて
複雑になってきたらリファクタリングしてクラス化

337:デフォルトの名無しさん
08/04/29 14:42:55
100行くらいなら、多分関数のみ

338:デフォルトの名無しさん
08/04/29 14:47:37
メソッドのことを関数と言ってる奴は同一人物

339:デフォルトの名無しさん
08/04/29 15:12:32
>>333
>>いちいち関数化時に変数をグローバルにするのが面倒です。
>これはどういう意味なんだ

>>334 そのとうりです!!

>>338
トップレベルメソッドというべきでしたか?

340:デフォルトの名無しさん
08/04/29 15:59:49
確か三年ぐらい前に、初心者だった自分も同じようなことを言われたんだが
グローバル変数の使用はお薦めしない(書き捨ての短いコードだとしても)
エスパー>>334の例を借りると

def say_hello(name, hello)
 puts "#{name}さん、#{hello}"
end

say_hello(gets.chomp, 'ぐっもーにん')

こんな風に引数として渡したほうがいい

341:デフォルトの名無しさん
08/04/29 16:47:55
いくらなんでも324はないだろう

def init(opt)
$_option = opt
end
def exe(arg)
if $_option[:foo]

end

init :foo => :bar
exe "hoge"


とか?

342:デフォルトの名無しさん
08/04/29 16:53:28
俺の場合は新規作成した場合、自然と指が

class

って動いちまうなあ。

343:デフォルトの名無しさん
08/04/29 17:03:15
Pythonと比べるとRubyの方が直感的だと感じてしまうのはRubyに毒されたからなのか。
yieldの書き方とかはRubyの方がいいな。

344:デフォルトの名無しさん
08/04/29 17:06:54
コルーチンがわかってないんだろ

345:デフォルトの名無しさん
08/04/29 17:35:41
>>342
毎回指で書くなら自動化すればいいじゃない

346:デフォルトの名無しさん
08/04/29 17:47:28
これがコルーチンか。そう意識してみるとPythonの書き方もこれでもいいかと思えてくる。
でもRubyの方がコルーチンを中断している途中でなんか処理しているってイメージがしやすい気がする。
気のせいか慣れなのかもしれないけど。

347:デフォルトの名無しさん
08/04/29 22:15:27
メソッド・オーバーライトって、具体的に、どんなときに使ったことありますか?

348:デフォルトの名無しさん
08/04/29 22:31:43
ライブラリのメソッドを上書きしたいとき

349:デフォルトの名無しさん
08/04/29 22:49:20
それはわかるんだけど、具体的にどんなメソッドを上書きしたの?

350:デフォルトの名無しさん
08/04/29 23:10:38
inspect はしょっちゅうオーバーライドしてるなあ。
あと to_s も。

351:デフォルトの名無しさん
08/04/29 23:49:21
>>349
OKまずはageだ

・自分で設計したクラスのサブクラスを作ったとき(基本)
・他所から持ってきたライブラリのバグを自分で直すとき
・ライブラリの挙動を少しいじくったり、機能を足したいとき(たいていサブクラスを作って上書きする)

上書きコードがある程度の量になってきたら、自分用のラッパーライブラリを作ることもある

352:デフォルトの名無しさん
08/04/30 00:41:49
再定義はオーバーライト(overwrite)じゃなくてオーバーライド(override)だな。


353:デフォルトの名無しさん
08/04/30 01:19:44
そういえば、Object#inspectって循環参照があるオブジェクトに対してもちゃんと動くよね
これってどうやって検出してるんだろう。inspectは特に引数を受け取るでもないし

354:デフォルトの名無しさん
08/04/30 07:48:36
>>353

Thread.current[:__inspect_key__] でobject_idを覚えてる。

355:デフォルトの名無しさん
08/04/30 09:26:26
>>354
スレッドローカルストレージ使っているのか。なるほど。
353じゃないが参考になった。
これからもあわあわと質問に解凍しやがってください。

356:デフォルトの名無しさん
08/04/30 11:34:29
>>354
そういうことかー。返答ありがとう。

357:デフォルトの名無しさん
08/04/30 18:32:29
javaが呼べるのは便利そうだけど
c++(cじゃなくて)の呼び方がまとめてあるサイトないですか?

358:デフォルトの名無しさん
08/04/30 19:38:33
railsでないRubyではDB操作するのに何が一番使われてますか?
素のライブラリ?DBI?ActiveRecord?

359:デフォルトの名無しさん
08/04/30 23:38:38
O/R MapperならActiveRecordかDataMapper
そうでなければDBIかMySQLライブラリ直書き

360:デフォルトの名無しさん
08/05/01 00:28:23
activerecordだけ使うならrailsでやればいいのに
って思う。

361:デフォルトの名無しさん
08/05/01 00:31:00
「Rails使うならActiveRecord使えばいいのに」なら分かるが
その逆はイミフだなぁ。


362:デフォルトの名無しさん
08/05/01 17:18:14
initializeを勝手に呼び出すのは良くないんでしょうか。

class Foo
  ...
  def refresh
    initialize
  end
end

363:デフォルトの名無しさん
08/05/01 17:38:07
よくないです

っていうか、そういうような処理を initialize に書いたらダメです
たとえば、別途セットアップ系のメソッドを作って、initialize と refresh から呼ぶようにするとかしてください

364:デフォルトの名無しさん
08/05/01 18:32:18
>>363
なんでよくないの?

365:デフォルトの名無しさん
08/05/01 19:28:22
>>340
あー、わかります。

でもRubyは参照渡し?できないですよね。

単発なら返却値で返す。
複数の返却値だとタプル?じゃなくて配列で返して、
 hoge, mage = gethogemage
でよかったと思うんですが、なれてないと妙に気持ち悪いw
みんなこんなのやってんのかな

>>342
まず体を慣らすのはいいかもですねw

私も一番慣れてる言語だと、ファイル新規作成したら無意識でclass構文が書けます(まあ大抵はスニペット使いますけど)

366:デフォルトの名無しさん
08/05/01 22:27:49
>365
Rubyはむしろ全て参照渡しと言っても良いくらいなのだが。

ただし代入(=、+=など)は変数の参照先を変えてしまうので
自身を書き換えるメソッドを使わず代入で書き換えようとした場合
変数の参照先が変わり、値渡しみたいに見える。

例えば文字列なら concat は文字列自身を書き換えるが
+= は新しい文字列を作り変数の参照先を書き換えるので元の変数に影響がない。

FixnumやSymbolなどは、自身を変更するメソッドを持たないので
実質的に値渡しになる。

367:デフォルトの名無しさん
08/05/01 22:29:19
>>364
べつにいいと思うよ、何度呼ばれてもいいように設計されていれば。
foo = Foo.new(0) # Foo#initialize(0) が呼ばれる
foo.do_something!
foo.initialize(0) # リセットする
foo.do_something!
foo.initialize(0) # リセットする
...

もちろん>>363のようにしてもいい。すきにどうぞ。


368:デフォルトの名無しさん
08/05/01 23:57:27
正規表現でCの文字列リテラルにマッチするようなのって書けないでしょうか?
/".*?"/にすると"aaa\"bbb"みたいな場合に"aaa\"で終わってしまいますが全体にマッチして欲しいんです
/".*(?<!\\)"/にしようと思ったら1.8では(?<!)が使えませんでした

369:デフォルトの名無しさん
08/05/02 00:03:40
"([^"]*?\\.)*.*?"
とかよく書くけど、どうかな

370:デフォルトの名無しさん
08/05/02 00:12:20
/"([^"\\]|\\.)+"/
こんな感じ?

371:デフォルトの名無しさん
08/05/02 00:28:07
>>369 >>370
どちらでもいけました、ありがとうございます!
なんでこれでいいのかまだ良くわからないので頑張って解読します

372:デフォルトの名無しさん
08/05/02 02:12:18
>>371
/"[^\\"]*(\\.[^\\"]*)*"/

こっちのほうが早いかな。

詳説 正規表現を読むのをオススメするよ

373:デフォルトの名無しさん
08/05/02 02:15:20
db等の外部リソースを使った時は
Rubyの終了時にメモリは自動的に解放されているのでしょうか?
明示的に解放しないとだめですか?

374:デフォルトの名無しさん
08/05/02 03:21:27
ここでいいのか不明なのですが…もし良ければおしえてください

やりたいことは
CarbonEmacs上にて起動したirbで
require 'rubygems'
を行いたい。です。

環境は
OSX10.4にてCarbonEmacs2008春版を使用しています。
rubyはMacPortsからインストールしたものを使用し、
rubygemsもMacPortsからインストールしました。

375:374
08/05/02 03:23:56
以下Terminal.appから実行した結果です
/Users/hoge% uname -a
Darwin hoge.local 8.11.1 Darwin Kernel Version 8.11.1: Wed Oct 10 18:23:28 PDT 2007; root:xnu-792.25.20~1/RELEASE_I386 i386 i386
/Users/hoge% ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin8.11.1]
/Users/hoge% which ruby
/opt/local/bin/ruby
/Users/hoge% gem -v
1.1.1
/Users/hoge% which gem
/opt/local/bin/gem
/Users/hoge% echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
/Users/hoge% irb
irb(main):001:0> puts $:
/opt/local/lib/ruby/site_ruby/1.8
/opt/local/lib/ruby/site_ruby/1.8/i686-darwin8.11.1
/opt/local/lib/ruby/site_ruby
/opt/local/lib/ruby/vendor_ruby/1.8
/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin8.11.1
/opt/local/lib/ruby/vendor_ruby
/opt/local/lib/ruby/1.8
/opt/local/lib/ruby/1.8/i686-darwin8.11.1
.
=> nil
irb(main):002:0> require 'rubygems'
=> false
--------
rubygemsをrequireしてもエラーになりません。
(.irbrcにてrequire済なので再読み込みはしませんが)


376:374
08/05/02 03:25:02
対してCarbonEmacs上のrun-rubyにて起動したirbでの実行結果です
irb(main):001:0> puts $:
/usr/lib/ruby/site_ruby/1.8
/usr/lib/ruby/site_ruby/1.8/powerpc-darwin8.0
/usr/lib/ruby/site_ruby/1.8/universal-darwin8.0
/usr/lib/ruby/site_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/powerpc-darwin8.0
/usr/lib/ruby/1.8/universal-darwin8.0
.
nil
irb(main):002:0> requrie 'rubygems'
NoMethodError: undefined method `requrie' for main:Object
from (irb):2
--------
実行時のパスが異なるようです
どのようにしたら、この問題を解消できるでしょうか。

377:デフォルトの名無しさん
08/05/02 03:33:48
うん、そのtypoは俺もよくやるよ

378:374
08/05/02 03:52:32
>>377
まちがえました…ご指摘ありがとうございます
typoしなくても以下の通りです

irb(main):001:0>
No such file to load -- rubygems
from (irb):1:in `require'
from (irb):1


379:デフォルトの名無しさん
08/05/02 05:40:38
>>366
オブジェクトが参照なのと、引数の参照渡しを一緒にスンナ
何が「すべて参照渡しと言ってもいいくらい」だ

380:デフォルトの名無しさん
08/05/02 12:10:57
「参照の値渡し」とか「オブジェクト渡し」とか言われる形態だな

381:デフォルトの名無しさん
08/05/02 14:35:21
>>378
FinderからではなくTerminal上で open -a Emacs とする、
もしくは .emacsに irb の位置をフルパスで指定する、のどちらか。

後者なら、~/.emacsなどに
(setq ruby-program-name "/opt/local/bin/irb")
と書けばいいと思う。たぶん。


382:デフォルトの名無しさん
08/05/02 15:43:21
TechCrunch Japanese アーカイブ ? Twitter、Ruby on Railsを放棄か
URLリンク(b.hatena.ne.jp)

383:デフォルトの名無しさん
08/05/02 18:21:49
Emacs から info で Ruby のマニュアルを調べたいと考えているのですが、
現在、配布されているドキュメントは html 形式のみですよね

Ruby 1.4 の時に配布されていた info
ruby-texi-1.4.tar.gz
も、ネット上のどこにも落ちていない…

384:374
08/05/03 00:25:29
>>378
感謝です。おっしゃるとおりでした。
後者も有効です。

385:デフォルトの名無しさん
08/05/03 17:38:08
Rubyに抽象メソッドって無いの?

386:デフォルトの名無しさん
08/05/03 18:14:12
>>385
実行前に実装を強制させる仕組みはない。

定義してなければ呼んだときにmethod_missingが呼ばれる。
あとは
スーパークラスで抽象メソッドにしたいメソッドを定義して
raise NotImplementedError
するとか
inheritedフックを使って、継承した時点でチェックするとか。


387:デフォルトの名無しさん
08/05/03 18:31:01
>>386
Class#inheritedがよさげです
ありがとうござました

388:デフォルトの名無しさん
08/05/03 18:45:07
inheritedって class Hoge < Moge の中を実行する前に呼ばれてるような。


389:デフォルトの名無しさん
08/05/03 22:45:28
どうしてruby使ってるの?
pythonでなくてrubyを使う理由って何でしょう?
日本人が作ったのが誇らしいとかですか????

390:デフォルトの名無しさん
08/05/03 22:50:50
?が2個以上連続しているレスは釣り

391:デフォルトの名無しさん
08/05/03 23:15:38
Ruby 初心者スレッド Part 18
スレリンク(tech板:623番)

623 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/24(月) 14:34:59
どうしてrubyなの?
実績も何も無い言語ですよね
pythonじゃなくてrubyを使う理由を一つでもいいから教えてください
開発者が日本人なのが誇らしいとか??????

392:デフォルトの名無しさん
08/05/03 23:18:17
>>389
どうして日本語使ってるの?
英語でなく日本語使う理由って何でしょう?
日本人が作ったのが誇らしいからですか????

393:デフォルトの名無しさん
08/05/04 01:11:30
イエス!ジャパニーズ!
ノー!フューチャー!

394:デフォルトの名無しさん
08/05/04 02:41:51
pythonはopen classじゃないとかいろいろめんどい

openclassはちゃんとしたアプリがつくれない、って言われてるけど
その通りだと思う。でもスクリプト(笑)言語でちゃんとしたアプリは
作らないから問題ない。

395:デフォルトの名無しさん
08/05/04 07:31:41
式と文や、メソッドと属性なんかが分かれてるのが気に入らない。

396:デフォルトの名無しさん
08/05/04 11:46:23
クラス内部でしか使わないサブルーチンのようなメソッド定義ってできますか?
たとえば、
class Hoge
def a(int1, int2)
return int1+int2*int2
end

def self.b(int)
p a(3, int)
end
end

Hoge.b(5)

の様には書けないんでしょうか。
classとselfとHogeを外すと正常に動作するんですが。

397:デフォルトの名無しさん
08/05/04 11:55:54
Pythonは「メソッド=メソッドオブジェクトが入った属性」な感じ?
メソッド側に属性を統一するのがRuby流で
属性側にメソッドを統一するのがPythonって思ってる。

俺の場合はlambdaの使い難さで使わないけどな。>>Python
文が書けないし、構文自体が無茶になるから
結局、一時的な関数内関数を書きまくることに。

398:デフォルトの名無しさん
08/05/04 11:58:13
aをselfしてprivateに指定するんでしょうか?


399:デフォルトの名無しさん
08/05/04 12:03:11
>>396
クラスメソッドとインスタンスメソッドと特異メソッドの勉強が必要

400:デフォルトの名無しさん
08/05/04 12:06:21
観念的なのは10冊くらい読んだのですが、結局、よくわからんのです。
実際の挙動というか、メモリ上の状態を記述しているような
説明がないので。
一応、インスタンスはコピーという感じで良いんでしょうか。
クラスと特異の実際の状態が掴めないのでよく解りません。


401:デフォルトの名無しさん
08/05/04 12:17:25
>>400
中田育男先生の
コンパイラの構成と最適化 お勧め

402:デフォルトの名無しさん
08/05/04 12:20:51
つprivate_class_method

403:デフォルトの名無しさん
08/05/04 12:34:20
>>396
self.bの定義の中ではselfは(挿入されている特異クラスはさておき)
Hogeというクラスそのものなわけだが、このとき(レシーバを
省略した)aの呼び出しでも、当然レシーバはself(=Hogeクラス)
になる。



404:デフォルトの名無しさん
08/05/04 13:04:58
>>400
この辺はじっそうによるからなあ。
コード書いてみて、実験したりして挙動を確かめる方が身につくよ。
本も大事だけどさ
コード書かないで理解は無理だべさ

405:デフォルトの名無しさん
08/05/04 13:18:59
>>396
まずどういう目的で、何をするためのスクリプトを書いてて詰まったのか
そこを書いた方が回答しやすい

学習目的なら、特異メソッド(Hoge.b)の理解は後回しで良い
それよりも、まずクラスとインスタンスの概念を理解することが先


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch