Ruby 初心者スレッド Part 19 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
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('Wikipedia項目リンク')

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('Wikipedia項目リンク'))
なら動作しました

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のページ構成はきちんとそのようになってるかい?


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

4692日前に更新/261 KB
担当:undef