全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 901- 最新50
Ruby 初心者スレッド Part 27

11様2009/04/02(木) 09:42:23
プログラミング言語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つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
21様2009/04/02(木) 09:43:25
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」

文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
「初めてのRuby」


以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください
「Rubyレシピブック 第2版 268の技」(初心者向け)

「プログラミングRuby 第2版 言語編」(初心者向け)

「Ruby Way 第2版」(脱初心者向け)

「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)


以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません
「プログラミング言語 Ruby」(言語として深く知りたい人向け)
31様2009/04/02(木) 09:45:06
Ruby 公式・非公式便利サイト2009

Ruby Home Page 【公式、お役立ち度が微妙】
http://www.ruby-lang.org/ja/
Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
http://www.ruby-lang.org/ja/man/
http://www.ruby-doc.org/ 【詳しい英語版】
HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
http://www.ruby-doc.org/docs/ProgrammingRuby/
Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
http://jp.rubyist.net/magazine/

逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
http://www.namaraii.com/rubytips/
はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
http://d.hatena.ne.jp/keyword/Ruby

RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
http://www.rubyforge.org/
GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
http://github.com/

日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
http://jp.rubyist.net/
41様2009/04/02(木) 09:46:21
関連スレ

本スレ
Rubyについて Part 35
http://pc12.2ch.net/test/read.cgi/tech//

アンチスレ
Rubyについて(アンチ専用) Part003
http://pc11.2ch.net/test/read.cgi/tech//

Railsスレ
【Ruby】Ruby on Rails Part6
http://pc11.2ch.net/test/read.cgi/php//

Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc11.2ch.net/test/read.cgi/tech//

Ruby 1.9 系列スレ
魁け! Ruby 1.9.X
http://pc11.2ch.net/test/read.cgi/tech//
5デフォルトの名無しさんsage2009/04/02(木) 13:07:16
英語板に振ったアホがいるが、これは単なる技術英語なので、文法論は意味がない
命令文でもないのに Abort. と表示されるのはおかしいなんて指摘しても意味があるまい
6デフォルトの名無しさんsage2009/04/02(木) 13:16:41
>>5
(前スレ質問再掲)
> □ 996  デフォルトの名無しさん  [] 2009/04/02(木) 12:43:26
>
> 英語のエラーメッセージで
> 「not found, ignored.」
> のような、かなりシンプルな構文で書かれることがありますが、これを英文法
> 上の用語でなんと言いますか?
>
> また、これについて勉強できる書籍(など)があれば教えてください。

どう見ても英文法の質問です。本当に(ry
真面目な話、このスレよりはスレ違いじゃなかろうと思ったんだが、まずかったらすまんかった。
7デフォルトの名無しさんsage2009/04/02(木) 13:23:18
そういやクラスやメソッド名を英語で付けようとして困ったということがよくあるなあ
みなさんどうしてますか?
8デフォルトの名無しさんsage2009/04/02(木) 13:24:37
エスパーするなら
「こういうのどうやって書いたらいいかわからないので調べたいです、必要な用語を教えてください」
だと思うけどね
文法書レベルの用語を知るためだけに質問したとは思えねー

どう書くかというのは、もう英語のソースや技術文書読むしかないな
なるべく大きなプロジェクトのもの
技術文書に関しては企業プロダクトのものが好ましい

技術英語と略語掲示文を解説した本には実は心当たりがあるんだが、見つかんねえ
無理してでも買っておけばよかった
9デフォルトの名無しさんsage2009/04/02(木) 13:28:27
○○体とか言うんじゃなかった?
まあ英文法書にはのってねーだろ普通。文系は帰れよ。
10デフォルトの名無しさんsage2009/04/02(木) 13:33:15
English板に振るほど板違いではないが、Ruby固有の問題でもないので掘り下げるのはスレ違いかなーという感じだな
ネイティブを真似っこするしかあんめえ
11デフォルトの名無しさんsage2009/04/02(木) 13:46:19
>>7
その手のスレはム板に専用のがちゃんとあるよん

ソースのコメントを英語で書くスレ
http://pc12.2ch.net/test/read.cgi/tech//

クラス名・変数名に迷ったら書き込むスレ。Part14
http://pc12.2ch.net/test/read.cgi/tech//
12デフォルトの名無しさんsage2009/04/02(木) 13:51:41
>>11の上で似たような話題が出てるね

ソースのコメントを英語で書くスレ
http://pc12.2ch.net/test/read.cgi/tech//563

> 関数やメソッドの説明って主語の this function とか this method とかが省略されて
> 動詞から始まることが多いんだけど、色々調べてみるとその動詞に
> ...
1311sage2009/04/02(木) 14:06:43
それ質問してるの俺だからw
14デフォルトの名無しさんsage2009/04/02(木) 14:08:45
>>11-12 が(実用度的に)ベストアンサーっぽい?

質問の答えとしてまとめてみると、

・エラーメッセージは文法を崩していることもある
・エラーメッセージとしての慣習や慣用的な言い回しがあり、それらには英文法上の呼び名があるときも無いときもあるだろう
・勉強するならむしろ技術書を当たった方がいい?(エラーメッセージのガイドライン等)

ってこと、かな?適当なので訂正よろ。
15デフォルトの名無しさんsage2009/04/02(木) 14:32:28
>>13
ワロタ
このリンクは収穫だったわ
http://java.sun.com/j2se/javadoc/writingdoccomments/index.html#styleguide
16デフォルトの名無しさんsage2009/04/02(木) 17:15:51
むしろ松本教祖の英語力に疑問があるけどな。
17デフォルトの名無しさんsage2009/04/02(木) 17:46:25
あんま関係ないかも知れんが、
俺他人にプログラミングを教えるときは、メソッド名とかを
あえて日本語ローマ字で書いてる。 (def shokika とかね。)
初心者のうちは、どれが自分で作ってる部分でどれが言語仕様なのか
区別つかんだろうなーと思って。
(ダサさ満点だけど)
18デフォルトの名無しさんsage2009/04/02(木) 19:36:39
>>17
それ公開されているプログラムでも見たことがある。
p2とか見てみなよ面白いからw
19前スレ751sage2009/04/02(木) 19:43:34
FasterCSVでExcelで出力したcsvで以下のエラーが出る件ですが、解決いたしました。
" Unquoted fields do not allow ¥r or ¥n (line 1)."

CSV自身の改行は¥r¥nで特に問題なく困っていたのですが、
どうやらFasterCSV自身は改行を ¥n(0A) として扱っているらしく、¥r¥n(0D 0A) が混じるとエラーが出る場合があるようです。
以下のように改行コードを明示的に指定(:row_sep => "¥r¥n")してやると無事に読みこむことができました。

 FasterCSV.read(filename, :encoding => 'sjis', :row_sep => "¥r¥n")

:row_sepはデフォルトでは :autoになっているみたいですが、場合によってはエラーになるみたいです。

というわけで、皆様ありがとうございました。

# しかし、出力時もFasterCSVで改行コード指定しなかったら ¥n だけになってて orz
20デフォルトの名無しさんsage2009/04/02(木) 19:47:41
引数としてもらったブロックを他のメソッドのブロックとして渡す、ということは可能なのでしょうか?
ブロックを持つメソッドのラッパーなどを作った場合に、どうしたものかと。

今は、Procで受け取って、メソッド呼び出し時にわざわざブロックを作ってその中で Proc.callしています。
以下のような感じです。

def open_from_nantoka(filename, &block)
 open(filename) {|f| block.call(f) }
end
21デフォルトの名無しさんsage2009/04/02(木) 19:54:05
def open_from_nantoka(filename, &block)
 open(filename, &block)
end
22デフォルトの名無しさんsage2009/04/02(木) 20:00:10
>>20
普通に

open(filename, &block)

でいけると思うんだけど。

$ irb
irb(main):001:0> p = lambda { puts "hoge" }
=> #
irb(main):002:0> 3.times(&p)
hoge
hoge
hoge
=> 3
23デフォルトの名無しさんsage2009/04/02(木) 20:45:46
>>21-22
ありがとう。& つければよかったのか…
マニュアルでは "ブロック付きメソッド呼び出し"のところにありました。
24デフォルトの名無しさんsage2009/04/02(木) 20:48:09
まー単純なクラスとメソッドの説明に乗らないそのへんはマニュアル一通り読んでもらわないとわからんな
25デフォルトの名無しさんsage2009/04/02(木) 20:50:39
mapとかで便利以外のSymbol#to_proc の便利どころを探してます。
1.8.7から使える Symbol#to_procって Methodの代わりのようには使えないのでしょうか?

irbで以下のようになって、 ?と首を傾げています。

> def a(method) method.call "hoge" end
=> nil
> a(Kernel.method(:puts))
hoge
=> nil
> a(:puts.to_proc)

=> nil
26デフォルトの名無しさんsage2009/04/02(木) 21:23:03
class Symbol
 def to_proc
  lambda{|receiver, *args| receiver.__send__(self, *args) }
 end
end

みたいなもんだから。
レシーバは既に知ってるMethodの代わりにはならないんじゃないかと。
27デフォルトの名無しさんsage2009/04/02(木) 21:58:30
a(:puts.to_proc) は、self.puts() という意味になっちゃうから、
でもってこれはinclude KernelしているObject#puts()だから、
改行して終了ということだな。
28デフォルトの名無しさんsage2009/04/03(金) 00:13:40
LAMPという言葉がキモくて仕方がありません。

いったい誰がこのような言葉を広めたのでしょうか。
流行?
web2.0と同じくらい下らない。

そもそもこの言葉使いますか?
「おし、じゃあサクっとLAMP環境構築しておいてよ」
「これからはPHPだよな。LAMPさいこー」
なんて言いますか?

こんなキモい言葉が港では当然のように使われているのが許せません。
早く死語になりますように ><
29デフォルトの名無しさんsage2009/04/03(金) 00:20:23
Rubyが先に死なないようにしないとね。
30デフォルトの名無しさんsage2009/04/03(金) 00:24:57
LAMP には別に正負どっちの感も持たないけど
>>28はうっとおしいと思った。
3128sage2009/04/03(金) 00:30:31
見ておくれ、このひどい有様を!!
http://ja.wikipedia.org/wiki/LAMP

構成要素に応じてAMP、LAPPのように言葉も変わっている類似用語があげられてる。
これこそまさにキモい!

なにコイツらって感じ。
「俺は面白い言葉遊びを考えたんだぜ〜」とか思ってるのか?

そして「は?LAMPも知らないの?」と、知っていて当然のように喧嘩売ってくる奴は、きっとこの言葉遊びの工作員だから、いっしょに死んで欲しい。
32デフォルトの名無しさんsage2009/04/03(金) 00:32:11
港でlampが使われるのは用途あってのことだろうしどうでもいいだろ
33デフォルトの名無しさんsage2009/04/03(金) 01:19:27
マカだと、MAMPとか逝ってるしな。リナックスでいいだろと思う。
34デフォルトの名無しさんsage2009/04/03(金) 01:27:59
うーん、微妙だ
35デフォルトの名無しさんsage2009/04/03(金) 04:07:39
結局>>28自身がキモイだけだったな。
36デフォルトの名無しさんsage2009/04/03(金) 08:08:04
       /ニYニヽ
   (ヽ   /( ゚ )( ゚ )ヽ   /)
  (((i ) /::::⌒`´⌒::::\  ( i)))  でっていうwwwwwwwwwwwwwww
 /∠_| ,-)___(-,|_ゝ \
( ___、  |-┬-|    ,__ )
    |    `ー'´   /´
    |         /

37デフォルトの名無しさん2009/04/03(金) 10:22:11
    _, ._
  ( ・ω・)
  ○={=}〇,
   |:::::::::\, ', ´
、、、、し 、、、(((.@)wwwwwww
38デフォルトの名無しさんsage2009/04/03(金) 11:55:37
class C
attr_accessor :hoge
end
p C.new.instance_variables

class C
def initialize ; @hoge=nil; end
attr_accessor :hoge
end
p C.new.instance_variables

結果

[]
["@hoge"]

…まーそりゃ確かに hoge= が呼ばれない限り @hoge は存在すら感知できませんが、なんかちょっとヤだなあ
instance_variables を使ってナニカの存在をチェックするという行為のほうが筋が悪いきちんとデータベース作っとけというのは
いやもう全く以ってその通りではございますですが
39デフォルトの名無しさんsage2009/04/03(金) 12:20:45
明示的に初期化しましょう、で終了
40デフォルトの名無しさんsage2009/04/03(金) 12:22:04
初期化(笑)
41デフォルトの名無しさんsage2009/04/03(金) 12:24:11
attr_accessorが作るのはメソッドであって変数そのものではないのだが
なにか勘違いしてるんじゃないだろうか
42デフォルトの名無しさんsage2009/04/03(金) 12:28:39
p @hoge



@hoge=nil
p @hoge

が状態が違うというのはあまり好きではない
オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする
43デフォルトの名無しさんsage2009/04/03(金) 12:42:50
>>26-27
ありがとう。

なるほど、receiverはself固定なのね
やっぱ代わりにはならないか

Kernel.method(:puts)が書きずらいなーと思ったので、
:Kernel.puts.to_proc ってまあ、無理かw
44デフォルトの名無しさんsage2009/04/03(金) 12:45:18
>>28 じゃないけど、職場でLAMPって言葉使ったら、m9(^Д^)プギャー!!されてしまった。
そんな言葉、聞いたことないよ、と
用語説明しても、それは単にソフトウェアの構成のことであって、うんぬん
45デフォルトの名無しさんsage2009/04/03(金) 12:51:15
Wintelみたいなもんだろ?>LAMP
言葉は知ってても使わない、っていう人も多いだろうし、知らない人は知らないし。
言葉だけではとくに m9(^Д^)プギャー!! されるもんでもなかろう

使い方じゃね?
46デフォルトの名無しさんsage2009/04/03(金) 12:51:38
>>42
いきなり

if @name.nil? then
@name = '上戸彩'
end

とかできないのか

全部initializeで初期化するべきだな
47デフォルトの名無しさんsage2009/04/03(金) 12:56:07
>>46
こういうときって defined? と nil? 両方でみるべきなのかね
if defined?(@name) || @name.nil?
@name = "mage"
end

いや、やっぱinitializeでnil初期化がらくだ
48デフォルトの名無しさんsage2009/04/03(金) 12:58:14
attr_accessor に、全部nilで初期化ってくらいのオプションがついててもいいと思うんだ。
どうせsyntax sugarなんだから。
49デフォルトの名無しさんsage2009/04/03(金) 12:59:37
>>44
知らない奴が知ってる奴に「m9(^Д^)プギャー!!」するのは何かおかしいだろう。
まあ知ってるからどうだという言葉ではあるが。
50デフォルトの名無しさんsage2009/04/03(金) 13:17:46
>>46
@name ||= '上戸彩'

>>42は = で代入が行われてないインスタンス変数は instance_variables に登録されないとかなんかその辺の話だろう
どちらも nil を返すが後者はインスタンス変数が存在していると
51デフォルトの名無しさんsage2009/04/03(金) 14:08:33
>>50

なんでだよw

@is_man = false
@is_man ||= true
p @is_man => true

「||=」と「if xxx.nil?」は違う
52デフォルトの名無しさんsage2009/04/03(金) 14:13:06
>>51
50じゃないけど慣用句的に使ってたよ('A`)
nilじゃないときは代入、みたいに
53デフォルトの名無しさんsage2009/04/03(金) 14:16:03
falseが入ってこないという仕様ならいいと思う

ただ完全な置き換えではないということは知っておかないと、
リファクタリングのときとか微妙に挙動を変えることになるかもね。
微妙なのがわかりづらい。あからさまなのはわかりやすい。
54デフォルトの名無しさんsage2009/04/03(金) 14:23:51
FlaseClass のオブジェクトがどこからともなく入ることはそもそもありえないだろ
55デフォルトの名無しさんsage2009/04/03(金) 14:41:12
Flase

落ち着け

つ旦‾
56デフォルトの名無しさんsage2009/04/03(金) 14:53:44
>>54みたいに間違いを指摘されると意固地になるやつって面倒なんだよな
指摘しないと仕事にならないときとか困る
やんわり言ってもやんわり意固地になるし・・・どーすりゃいいのよ
57デフォルトの名無しさんsage2009/04/03(金) 15:35:31
>>56
>>46が @name == false をチェックしてないということ自体が答だろ
false はこの場合「入るはずがない」のが前提
nil? メソッドを defined? でチェックしてないのと同じ
58デフォルトの名無しさんsage2009/04/03(金) 15:50:59
もしfalseが入ってるなら上書きしちゃまずくないか?
という流れじゃないのか?おれの勘違いだったらスマン
59デフォルトの名無しさんsage2009/04/03(金) 16:01:17
false の時は動作しないだろ、という突っ込みが文脈上無意味またはオタ臭い重箱隅つつき、というようなアリガチな話だと思った
60デフォルトの名無しさんsage2009/04/03(金) 16:05:14
>>46
できる。未定義のインスタンス変数を参照するとnilが返るから。
でもって>>50
@ivar ||= val という書き方を提案した。
これは @var = val unless @ivar みたいなもんなので
>>51が@varがfalseでも上書きしちゃうぞ、と突っ込んだ
61デフォルトの名無しさんsage2009/04/03(金) 16:10:23
DBのブール型を普通に使ってるおれは興味深かったが、
true/falseを変数に入れるって使わないやつは使わんのかね。
62デフォルトの名無しさんsage2009/04/03(金) 16:14:19
>>60

>>42をよく嫁よ
オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする
63デフォルトの名無しさんsage2009/04/03(金) 16:47:54
>>46からの流れだよ。
>>42の意見はどーでもよかったから省いた。
そんな仕様だったら死ぬ。
64デフォルトの名無しさんsage2009/04/03(金) 16:56:18
>>40
なにが(笑)なのかkwsk
65デフォルトの名無しさんsage2009/04/04(土) 00:20:16
普段pythonを使ってるのですが
rubyとの対応表みたいなのがあるサイトはないでしょうか

rubyを手間かけないで覚えたいのです
66デフォルトの名無しさんsage2009/04/04(土) 01:08:47
>>65
http://pub.cozmixng.org/‾the-rwiki/rw-cgi.rb?cmd=view;name=%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3
67デフォルトの名無しさんsage2009/04/04(土) 19:16:07
68デフォルトの名無しさんsage2009/04/04(土) 22:44:13
Hikiって文書の中にRubyのスクリプト埋め込んだりできないの?
69デフォルトの名無しさんsage2009/04/04(土) 23:04:56
Wikiの文書にサーバーで動作可能なスクリプトを埋め込めるとか怖過ぎるだろ…
70デフォルトの名無しさんsage2009/04/04(土) 23:06:19
Hiki公開しちゃダメ
71デフォルトの名無しさんsage2009/04/05(日) 04:39:49
http://asobi.sqweebs.com/cdxidyfk/sphvpisz.php

質問用テンプレ作りました。
72デフォルトの名無しさんsage2009/04/05(日) 09:48:03
テンプレ作ってくれて助かるが、webサービスにする必要あるのか?ww
73デフォルトの名無しさんsage2009/04/05(日) 09:49:12
>>71-72
せっかくなのでテンプレコピペ(ちょい修正)

◆質問用テンプレ
【詳しい内容(「動きません」「うまくできません」だけでは回答しにくい)】

【エラーメッセージ(自力で訳さずなるべくそのままで)】

【実行環境(OS名、Rubyのバージョン(ruby -v しる)】

【最終的にやりたいこと(もっとよい方法がある場合が多いため)】
74デフォルトの名無しさんsage2009/04/05(日) 10:16:28
>>71
乙、しかし Rubyで作れw
75デフォルトの名無しさんsage2009/04/05(日) 10:24:31
ランダムディレクトリ名でランダムファイルのCGIはアクセス解析とスパイウェア注入と相場が決まってる
アクセスしたお前らオタワ\(^o^)/
76デフォルトの名無しさんsage2009/04/05(日) 10:38:13
Rubyスレに貼られるPHPのCGIなんざ俺が踏むわけねーだろ
77デフォルトの名無しさんsage2009/04/05(日) 13:44:32
外部コマンドを一定時間実行して実行を打ち切るのってどうすればいいですか?

なんとかBSDでのTS抜き環境が出来てddコマンドでUSBデバイスからコピーすればデータが流れてくるようになりました。
停止しなければ延々放送波が流れてくるので、CTRL+Cで停止する必要があるのですが、
rubyでラッパーを書いて利用する際にどうすれば時間指定を出来るのかと思った次第です。
78デフォルトの名無しさんsage2009/04/05(日) 13:50:00
Rubyあんま関係ないな
システムコールとか勉強するといいぞ
時間指定は cron とかの外部スケジューラに任せるのが一般には間違いない
79デフォルトの名無しさんsage2009/04/05(日) 14:00:22
さっぱり分からんがスレッド使って時間をみたりするのはダメなのか?
80デフォルトの名無しさんsage2009/04/05(日) 14:22:59
子供を1時間動かしておいて、30秒だけしか待ってやらない親

require 'timeout'

pid = fork

if pid
begin
timeout(30) do
puts "waiting #{pid}"
sleep
end
rescue Timeout::Error
Process::kill('KILL', pid)
ensure
Process.wait
end
else
exec("sh -c 'sleep 3600'")
end
81デフォルトの名無しさんsage2009/04/05(日) 14:28:09
>>79
個々のスクリプトとしては sleep するしかないので、正直あんまりよくはない
自分の見てる前で30分だけ動かすとかそういうのならいいけどさ
82デフォルトの名無しさん2009/04/05(日) 21:04:00
OpenStructクラスで、[]、[]=、count(from Enumerable)などのメソッドを使いたいのに
定義されていない場合は、OpenStructを継承して派生クラスで定義してくれってことですか?
83デフォルトの名無しさんsage2009/04/05(日) 21:47:41
>>77

pid=fork

if pid==nil then
exec('やりたいコマンド')
else
sleep 動かしたい時間
# まずはSIGINTで止めてみる
Process.kill(pid,'INT')
stat=Process.waitpid(pid,Process::WNOHANG)
if stat==nil then
# ダメなのでSIGTERMで
Process.kill(pid,'TERM')
stat=Process.waitpid(pid,Process::WNOHANG)
if stat==nil then
# これもダメだったのでSIGKILLで。これなら確実に終了できる
Process.kill(pid,'KILL')
stat=Process.waitpid(pid)
end
end
end

確かforkは失敗すると例外を投げるはず
84デフォルトの名無しさんsage2009/04/05(日) 21:48:40
>>82
他にどーしろと…

st[0] でも st[:hoge] でも st.hoge でも st.each でもアクセス可能なコレクションというのは
デフォルトでは添付されてない
どれか諦めてくれ
8577sage2009/04/05(日) 22:44:07
>>80 >>83 有り難うございます
別のプロセスをforkで作り、子供側にはnilを返し親にはpidを返すので
下に分岐を入れて子供には外部コマンド実行、親にはスリープしたのちkillさせる、ってことですね。

確かにrubyはあんまり関係ない処理だなあ・・・。unixの勉強がいるなあ。
86デフォルトの名無しさんsage2009/04/05(日) 22:45:57
>>83
pid = fork {exec('...')} とブロックのほうがいいんじゃまいか
1.9ならspawnがあるんだが。
87デフォルトの名無しさんsage2009/04/05(日) 22:51:45
それから、シグナル送ってからちょっとくらい待ってやれよ。

以下、Bourne Shell版。

#!/bin/sh
やりたいコマンド &
pid=$!
sleep 動かしたい時間
kill -INT $pid 2>/dev/null &&
{ sleep 1; kill -TERM $pid 2>/dev/null; } &&
{ sleep 1; kill -KILL $pid 2>/dev/null; }
wait
88デフォルトの名無しさん2009/04/06(月) 01:21:04
クラス名を文字列で受け取ってnewしたいとき、どのようなコードになりますか。
いろいろ試してみたけど最終的にはシンプルにevalしか思い当たらないんですが、漠然と他にありそうなような。

classname = "SomeClass"
require classname #ファイル名とクラス名が同じと仮定した場合
obj = eval("#{classname}.new")
89デフォルトの名無しさんsage2009/04/06(月) 02:36:15
>>88
classnameが::を含まない前提?

> require classname #ファイル名とクラス名が同じと仮定した場合
普通は require classname.downcase

> obj = eval("#{classname}.new")
obj = Object.const_get(classname).new のほうが速い

active_supportあたりにそんな機能があるよ、確か。
9088sage2009/04/06(月) 06:20:11
>>89
ありがとうございます!
>>88の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため
evalしかダメでした。(evalした時点で暗黙に読み込まれる)
const_getだと、すでに読み込まれている定数に対してですが、
そのことに気づかずにあれやこれやと・・・orz
現在は修正してうまくいっています。

active_supportは使えない環境なんですが、ファイル名のことなども参考になりましたm(_ _)m
91デフォルトの名無しさんsage2009/04/06(月) 10:55:14
>>90
> >>88の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため
> evalしかダメでした。(evalした時点で暗黙に読み込まれる)
> const_getだと、すでに読み込まれている定数に対してですが、
> そのことに気づかずにあれやこれやと・・・orz
> 現在は修正してうまくいっています。
バージョンとエラーメッセージは?

$ echo 'class C; end' > c.rb
$ /usr/bin/ruby -ve 'autoload :C, "c"; p Object.const_get(:C); p $"'
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
C
["c.rb"]

92デフォルトの名無しさんsage2009/04/06(月) 18:37:54
Rubyプログラミング入門 ?はじめてのプログラミング、はじめてのRuby
ttp://www.bnn.co.jp/books/title_index/web/ruby_ruby.html
サンプルコードを読む限りはまー最初ならこんなもんじゃねーの、と思った
少なくとも同時期のナントカの冒険よりは読む価値があると思う

サンプルコードのダウンロードURLが書いてあったんだけど
まさかサイトに書いてない購入者限定の代物だとは思わなかったので記憶してくるの忘れた
サンプルコード公開すれば売上伸びる系統の本だと思うのに
93デフォルトの名無しさんsage2009/04/06(月) 19:10:52
Rubyの冒険とかめちゃくちゃ懐かしいんだが
それとは関係ないんだな
9490sage2009/04/06(月) 20:43:51
>>91
いただいたコードを見ると、const_getでautoloadしないわけではなかったのですね。
今一度自分のコードを見直してみたところ、const_getでautoloadできました。(解決!)

最初、Javaのように文字列からクラスを生成する書き方ばかり想像していて
>>88で説明のための適当なコードを載せたばかりに、余計な手間をおかけしました。
いまさらですができているコードを書いておきます。

#testfactory.rb
module TestFactory #モジュール内のメソッドは公開済み
 autoload :TestClass1, "testclass1.rb"
 autoload :TestClass2, "testclass2.rb"
 
 def get_instance(classname, *args) #インスタンスを返す
  # eval("#{classname}.new(*args)) #>>88の時点のコード
  
  # require classname.downcase       #>>90の時点のコード(レシーバ違いでrequireが必要だった)
  # Method.const_get(classname).new(*args) #requireしないと=> uninitialized constant Method::TestClass1
  
  self.const_get(classname).new(*args) #現在のコード(問題なし)
 end
 
 #その他の同種のメソッド
 def get_class(classname);       self.const_get(classname); end      #クラスを返す
 def method_missing(classname, *args); self.const_get(classname).new(*args); end #同じくインスタンスを返す
end
9590(続き)sage2009/04/06(月) 20:45:03
#test.rb
require "testfactory"   #ファクトリモジュールを読み込み
classname = get_classname #あるメソッドによりクラス名(文字列)を決定

obj = TestFactory::get_instance(classname, arg1) #OK!

Rubyのバージョンは以下のとおりです
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

ありがとうございました!
96デフォルトの名無しさんsage2009/04/06(月) 21:15:58
ruby:1.8.7
rails:2.1.0
でやってるんだけどto_dateって使えないの?
ググったら1.8.6だとprivateメソッドで定義されて〜
とか書いてたけどto_datetimeやto_timeとかもundefind methodになる…
97デフォルトの名無しさんsage2009/04/06(月) 21:19:21
>>96
Railsのライブラリで定義されてるメソッドの話はスレ違い
【Ruby】Ruby on Rails Part6
http://pc11.2ch.net/test/read.cgi/php//
9896sage2009/04/06(月) 21:24:10
>>申し訳。

そっちで聞いてみます。
99デフォルトの名無しさんsage2009/04/06(月) 21:27:17
スレ的にはRailsをRuby初学者が使うのは全くお勧めしない
100デフォルトの名無しさんsage2009/04/06(月) 22:46:32
「Rubyレシピブック 第2版 268の技」を買いたいと思ってるんですが
レシピブックって言うのはもっといたほうがいいんですかね?
言語挫折厨なもんで、、、便利なら買いたいと思っています。
101デフォルトの名無しさんsage2009/04/06(月) 22:52:58
>>100
対象がほんのり古いが、「Rubyは実際にどう書くのが一般的と考えられてるのか」がたくさん載っててとても便利
95%くらいは今でも使える、基本ライブラリを使うときはこう書いておけばとりあえずは恥ずかしくない、というコード片が満載

独学可能な領域なので無理してまで買わなくてもいいが、買うと勉強が早く済むよ
102デフォルトの名無しさんsage2009/04/06(月) 22:56:49
間違いなく買い
初版持ってるけど、よれよれになってるよ
103デフォルトの名無しさんsage2009/04/06(月) 22:58:48
ありがとうございます、買い、みたいですね。
参考にさせていただきます。
104デフォルトの名無しさんsage2009/04/06(月) 23:17:10
WindowsのRuby/TKで簡単なランチャを作って使ってるんですが
Rubyから別コマンドを実行するのがsystemしかなく
ふつうにsystem使うと、コマンド終了待ちでRubyが止まっちゃうので
Thread.new{system 'ほげほげ.exe 引数'}
としてます
外部コマンド一つ起動するごとにスレッドが増えるけど
外部コマンドが終了すればスレッドも終了するだろうし
同時に起動することなんて多くても数十程度だろうから
大丈夫かなと

forkしてexecするのが普通の同期しない外部コマンド起動のさせかたなんですか?
Windowsなんでforkできないのです
1.9だとspawnが使えるんですけど
105デフォルトの名無しさんsage2009/04/06(月) 23:30:02
>>104
win前提ならstartコマンド経由で呼べばすぐ戻ってくる
system "start ruby -e 'sleep 10'"
106デフォルトの名無しさんsage2009/04/06(月) 23:35:32
startはcmd.exeの内部コマンドなので
GUIから呼ぶと一瞬cmd.exe起動の為に
コマンドプロンプトウィンドウが出てしまうのです
rubyw -e "system('start winver')"
とかするとわかります
107デフォルトの名無しさんsage2009/04/06(月) 23:47:02
>>106
これはどうよ?
require 'win32ole'
wsh = WIN32OLE.new('Wscript.Shell')
wsh.Run('cmd /c echo', 0, false)
108デフォルトの名無しさんsage2009/04/06(月) 23:51:39
ああ、wsh 厨が来た

ってか Windows の cmd.exe の肝心なときに使えない度は異常
109デフォルトの名無しさんsage2009/04/07(火) 00:11:46
>>106
忘れてたorz

Thread.new{system 'ほげほげ.exe 引数'}.kill
というのは?スレッド殺してもプロセスまで殺さないはず。
110デフォルトの名無しさんsage2009/04/07(火) 00:19:59
>>108
ゲイツソフトに無理言うなよw
111デフォルトの名無しさんsage2009/04/07(火) 00:26:10
win32api使えばいいんじゃ
ttp://d.hatena.ne.jp/mokehehe/20070812/createProcess
112デフォルトの名無しさんsage2009/04/07(火) 00:51:25
ちゃんとするならWin32APIなんでしょうね
でも、お手軽じゃないなぁと
Thread.new{system 'hoge.exe'}
で、動いちゃってるので
まあいいかなとそのままです

>>109
すいません
私の場合は非同期に外部コマンドを起動したいだけなので
後々のコントロールできなくてもよいのです

でも、Windowsで >>77 みたいなことをRubyにさせようとすると
どうすればいいのでしょうね
Win32APIを駆使?
めんどくさそうだなぁ
113デフォルトの名無しさんsage2009/04/07(火) 01:17:57
>>112
CreateProcessするんじゃね?
使ったことないけど
114デフォルトの名無しさんsage2009/04/07(火) 09:31:01
1.8で、コマンドプロンプトを見せるな、という制限を課されるといろいろつらいな。
CreateProcessなりShellExecute(Ex)なりを直接叩くしかないと思う。
115デフォルトの名無しさんsage2009/04/07(火) 09:36:05
IO.popen(program, "w") とか
116デフォルトの名無しさん2009/04/07(火) 13:30:59
すみません。Cで拡張ライブラリを書くためにREADME.EXT.jaを
読んでいるのですが、次のような箇所があります。

> 既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を
> 使えば,Rubyの機能を実現している関数を直接呼び出すことが出来
> ます.
> # このような関数の一覧表はいまのところありません.ソースを見
> # るしかないですね.

これが書かれてから15年近く経った今でもそうなんでしょうか?
日本語・英語問わず、どこかに一覧表があれば欲しいのですが・・・。
117デフォルトの名無しさんsage2009/04/07(火) 18:07:07
rspec で BDD だとかなんかそんなのやってみようかなーと思ってるんだけど、
これってパブリックなメソッドの返り値しかチェックできないの?
いくつも小さなメソッドに分割された、ある程度フクザツなメソッド作ってる最中は役に立たない?
118デフォルトの名無しさんsage2009/04/07(火) 18:22:29
>>117

「作り始め」のメソッドの大きさはみんな一緒
119デフォルトの名無しさんsage2009/04/07(火) 18:34:39
tdiary 以外でテーマやスキンの充実した ruby アプリって何かありませんか。
120デフォルトの名無しさんsage2009/04/07(火) 19:31:53
Hiki
121デフォルトの名無しさんsage2009/04/07(火) 19:34:59
>>116
スレ違い
122119sage2009/04/07(火) 19:55:35
tdiary と同じテーマやスキン以外でお願いします><

MT や WP、Xoops みたいにド派手に変えられると嬉しいです。

Ruby ベースの CMS
ttp://diaspar.jp/node/79
をみてもテーマ公開しているの少ないよね…。
123デフォルトの名無しさんsage2009/04/07(火) 20:01:41
>>117
RSpecでテストとか勉強しようと思ってずっと待ってるんだけど、そういう解説は見たことないね
なんかテストのなんたるかを知ってる人が自由に使ってる感じがして、ちょっと寂しい
個々のマッチャとかの動作はわかりやすいんだけど、実際にこれどう使うのよみたいな
124デフォルトの名無しさんsage2009/04/07(火) 22:08:10
モデル・ビュー・コントローラの知識がないとたぶんダメ
125デフォルトの名無しさんsage2009/04/07(火) 22:27:18
>>122
PinkyBlog
126デフォルトの名無しさんsage2009/04/07(火) 22:29:47
>>123
TDDは俺もよくわからんので勉強中。

書籍だと「10日でおぼえる Ruby on Rails入門教室」がTDDやりながら開発する解説があるらしい。
rspecかどうかはわかんないけど

Amazon.co.jp: 10日でおぼえる Ruby on Rails入門教室: arton: 本

127デフォルトの名無しさんsage2009/04/07(火) 22:43:56
RSpecでBDDやって遊んでるだけでも、17インチ液晶の左右分割では幅が足りないと強く思う

家でだらだらスクリプト書いてるだけだしこれくらいでいいじゃんとこれまでは思ってたけど、ちょうど足りない
少なくとも19が欲しい
大きめフォントをちょっと小さくしたけど、やっぱ足りん
うおー
128デフォルトの名無しさんsage2009/04/08(水) 01:22:05
>>116
ttp://doc.loveruby.net/refm/capi/
ずっと503
ttp://www.ruby-doc.org/doxygen/1.8.4/index.html
doxygenの自動生成だからヘッダ読むのとほとんど変わらない
ttp://www.nilab.info/docs/Ruby1.6.8/refm364.html
かなり古い、1.6.8

こちらの知る限り現状はこんなところ
loveruby.netが直れば一番いいんだろうけどずいぶん前から503のままなので期待薄
129デフォルトの名無しさんsage2009/04/08(水) 07:49:58
csvをMySQLに食わせるtsvにしたくてモゾモゾやってるんだけど
a = ["mesi", "kue", "", "unko"]
として
a.map do |x|
if x == ""
x = "¥N"
end
end
の結果が
[nil, nil, "¥N", nil]
となるのは何でなんでしょう。eachじゃダメだし。
つーか、["mesi", "kue", "¥N", "unko"]にするステキな方法を
教えてくだしゃんせ。
130デフォルトの名無しさんsage2009/04/08(水) 08:12:54
ブロックつきの map{} は、ブロックの返り値で要素を置き換える
で、

irb> p (if 1 == 2 then "true!" end)
nil

else 節がない if 文で条件が偽だった場合の文そのものの返り値が nil だ
else を明示的に書くのがよい

a.map{|e| if e.empty? then "¥n" else e end}
131デフォルトの名無しさんsage2009/04/08(水) 08:24:47
x = "¥N" は x = "¥N" の返り値がたまたま "¥N" だったからたまたま動作しただけだな
ブロックつきメソッドは仮引数に代入することで動作するわけではない
[1,2,3].map{|x| x = x*2} というような書き方は誤りで、 単に返り値だけを [1,2,3].map{|x| x*2} のように書く
132デフォルトの名無しさんsage2009/04/08(水) 08:37:27
△ ブロックの返り値で要素を置き換える
○ ブロック内で最後に評価された値が要素と置き換わる

ブロックつきmapの「ブロックの返り値」は変換後の配列だ
ブロックで最後に評価された値のことをブロックの返り値と呼んではいけない
133デフォルトの名無しさんsage2009/04/08(水) 08:53:51
× if 文
○ if 式

公式でも if 文って書いてしまってるけどな
既存言語の影響は強い
134デフォルトの名無しさんsage2009/04/08(水) 09:30:31
Rubyでは文も式なだけであって、文を文と呼ぶのが誤りなわけではない。
135デフォルトの名無しさんsage2009/04/08(水) 09:59:47
最新のparse.yを見る限り、
symt→expr→arg→primary→if という流れになってるので、
ifは式です。
136119sage2009/04/08(水) 10:30:51
>>125
ありがと。
「CSS着せ替えテンプレートプロジェクト」の存在も知ることができて感謝。
137デフォルトの名無しさんsage2009/04/08(水) 10:49:01
少々お聞きします。
以下のソースにて、Ctrl+Cをトラップしようとして、

trap 'INT' do
 puts "TRAP!!"
 raise "ctrl+c"
end

loop do
 Kernel.sleep 1.5
end

実行してみたんですが、
Ruby win32 + コマンドプロンプト : OK
Ruby win32 + コマンドプロンプト + cygwin bash: OK
Ruby win32 + cygwin terminal + cygwin bash: x
Ruby cygwin + cygwin terminal + cygwin bash: OK

という結果になってしまいました。
Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?
138デフォルトの名無しさんsage2009/04/08(水) 11:10:14
>>133-135
Rubyでの文は「カッコなしのメソッド呼び出しの引数よりも優先順位が低い式」のこと。
139デフォルトの名無しさんsage2009/04/08(水) 11:12:34
>>137
> Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?

できてるだろ。
> Ruby win32 + コマンドプロンプト + cygwin bash: OK

非cygwinプログラムからはcygwin terminalはttyには見えないので、
Ruby win32 + cygwin terminal ではできない。
140デフォルトの名無しさんsage2009/04/08(水) 11:25:04
>>139
ごめん。コピペミス・・・

> Ruby win32 + コマンドプロンプト + cygwin bash: OK

Ruby win32 + コマンドプロンプト + cygwin bash: x

ていうか、調べてたら cygwin から nativeアプリに(non-cygwin app) Ctrl+Cは鬼門みたいですね…。
141デフォルトの名無しさんsage2009/04/08(水) 14:04:44
>>133
○if文
◎if式

こうでしょ?
例えば関数呼び出しは式であり文でもあり。
142デフォルトの名無しさんsage2009/04/08(水) 14:07:16
とりあえず一つだけ。
初心者スレに過度の原理主義はあんまりよくない。
やりたいなら、本スレにコピペでも持って行って存分にやればいいと思うんだ。
143デフォルトの名無しさんsage2009/04/08(水) 14:19:15
すまんかった。正直ifの扱いはどうでもいいんだけど
「文は返値を持たないものだけを指す」と言わんばかりなのが気になって。
初心者スレだけになおさらね。
144デフォルトの名無しさんsage2009/04/08(水) 14:20:23
文が値を返すのって感覚的にも不自然だと思う
if は if 式と意図的に呼ぶべき
初心者スレならなおさら、初期の用語の統一は非常に重要


うおー負けてるー
145デフォルトの名無しさんsage2009/04/08(水) 14:20:39
式の一部になれないのが文だっけ?
146デフォルトの名無しさんsage2009/04/08(水) 14:22:08
ifが式ってのが、Rubyの特徴のひとつだもんな。
147デフォルトの名無しさんsage2009/04/08(水) 14:27:06
「if 式」のほうが実態をよく表してるし勘違いの元にもならないし興味の取っ掛かりにもなる
つい口に出るもんなので仕方ないが、なるべく式と言うべきだと思った

ちなみに、 for なんかは式だったかどうかをよく覚えてないので
「制御構造 for」とかいう表現で逃げたりする
大人は汚いね!
148デフォルトの名無しさんsage2009/04/08(水) 14:30:52
>>145
あっちにレスした
http://pc12.2ch.net/test/read.cgi/tech//50
149デフォルトの名無しさんsage2009/04/08(水) 14:31:38
>>145
http://pc12.2ch.net/test/read.cgi/tech//50
> ( ) で囲めばなんでも式の一部 (primary) になる。
150149sage2009/04/08(水) 14:31:58
>>148
ごめん_| ̄|○
151デフォルトの名無しさんsage2009/04/08(水) 14:40:39
Cなどの既存言語の経験者が戸惑わないようにif文って呼んでるのに
その辺の事情を無視してif式って呼ぼうってのは、悪しき原理主義だよなあ

そういやこの前「関数って言うな」なんてのもあった
あれも根っこは一緒か
152デフォルトの名無しさんsage2009/04/08(水) 14:41:59
>>151
既存言語の経験者が同じだと勘違いするほうが問題とか、
少しも思わない?
153デフォルトの名無しさんsage2009/04/08(水) 14:44:53
初心者が引かない程度に抑えるのが肝要ってことでどうだろうか
スレの使い分け大事
154デフォルトの名無しさんsage2009/04/08(水) 14:55:49
>>151
なんで違うものをわざわざ同じ名前で呼んで混乱させようと思うわけ?
155129sage2009/04/08(水) 15:14:57
>>130-131

thx!
156デフォルトの名無しさんsage2009/04/08(水) 15:38:31
マニュアルの最初の説明でそう書いてある場合は、Rubyでは

            無理せずに

そう呼べばいいじゃんね
無理して別の名前で呼ぶ理由もなかんべ
157デフォルトの名無しさんsage2009/04/08(水) 15:48:45
>>117で話が出たので自分用スクリプトでちょっとやってみた
小さなメソッドひとつにつき正常と境界と例外で8つくらいずつテスト項目作る羽目になって非常にめんどくさい

別なとこ改造してもspecのテストさえ通ればとりあえず他への影響を忘れて次のことをしていいというのは気楽
158デフォルトの名無しさんsage2009/04/08(水) 16:45:49
a.map!{|s| s.sub(/var/, 'foo')} をもっと短く書く方法ってありますか?

なくてもいいのですが、なんか ruby ならありそうな気がして。
159デフォルトの名無しさんsage2009/04/08(水) 17:01:14
>>158
特にない
あと String#sub 系列はできれば sub(/var/){'foo'} と書いてくれ
これは Ruby の構造的欠陥だが
160デフォルトの名無しさんsage2009/04/08(水) 17:03:10
何十万回も置換を行うような場合は sub のブロック生成コストが気になるお年頃
161デフォルトの名無しさんsage2009/04/08(水) 17:04:58
{'foo'}あるいは{"foo#{1}bar"}程度のような単純なブロックは最適化してほしいもんだ
162デフォルトの名無しさんsage2009/04/08(水) 17:11:09
>>159
その構造的欠陥について詳細キボンヌ
163デフォルトの名無しさんsage2009/04/08(水) 17:51:27
後方参照するときに$1か¥1か迷ったり
¥をいくつ重ねればいいのか非常にわかりにくいという問題はある。

後方参照しないときまでブロックで書く理由は知らない。
転ばぬ先の杖じゃないかと思うけど、それなら理由書いたほうが。
164デフォルトの名無しさんsage2009/04/08(水) 18:01:30
単に構造的欠陥と言ってみたかっただけです。
165デフォルトの名無しさんsage2009/04/08(水) 18:09:02
ユーザーは何も悪くない以上、構造上の欠陥ではあるような気はする
166デフォルトの名無しさんsage2009/04/08(水) 18:31:02
そんなことよりもさー

require 'spec'
require 'logger'

class C
attr_accessor :log
def err
log.info('error!') if log
raise
end
end

describe "C" do
before :each do
@obj = C.new
end
describe "#err" do
it "ログにエラーの旨が記録されランタイムエラーが発生する" do
sio = StringIO.new ; @obj.log = Logger.new(sio)
lambda{lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')}.should raise_error(RuntimeError)
end
end
end

これをかっちょよく書く方法教えておくれよ
最初は
lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')
lambda{@obj.err}.should raise_error(RuntimeError)
って書いて上の行で例外が飛び出てうまくいかないって質問しようと思ってて、
書き込む寸前に lambda を2重にすることに思い至ったんだけど、なんかあんま普通っぽくないんだよねこれ
167デフォルトの名無しさんsage2009/04/08(水) 18:57:00
> これをかっちょよく書く方法教えておくれよ

高いスーツを買って、ポルシェで高級ホテルに乗り付け、
最上階のレストランでノートPCを開いて書く。
168デフォルトの名無しさんsage2009/04/08(水) 18:59:25
何という昭和w
169デフォルトの名無しさんsage2009/04/08(水) 19:02:56
> これをかっちょよく書く方法教えておくれよ

走ってくるトラックの前に飛び出して、
僕は死にません!Rubyが好きだから!僕は死にません!

で、泣き止んで家に帰ってから書く。
170デフォルトの名無しさんsage2009/04/08(水) 19:05:35
何という昭和からの平成w
っていうか平均年齢おかしいだろこのスレ
171デフォルトの名無しさんsage2009/04/08(水) 19:12:38
いま従事している ruby のプロジェクトで、
ソースファイルの改行コードがばらばらになっていることに気づきました。

開発は Windows、本番環境はLinuxです。
Linux の LF に合わせようと思いますが、質問です。

Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
たとえば、Windows 上で、改行コードが LF のソースを動かす、など。

もし問題ないのならば、そのままにしてしまおうかなとも考えています
(sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
172デフォルトの名無しさん2009/04/08(水) 19:20:16
なんか精神的に嫌だな。
173デフォルトの名無しさんsage2009/04/08(水) 19:31:29
>>123
RSpecの書籍がでるらしい。今はpdf版が無料で読めるみたいだ。
RSpec 本 1 章のメモ - たかみやの日記
http://d.hatena.ne.jp/ytakamiya/20090407/
174デフォルトの名無しさんsage2009/04/08(水) 20:58:07
質問させてください、Rubyで日本語を扱いたいと考えています

Rubyのバージョンは1.9.1です("ruby -v"を実行すると"ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]"とでます)
PCはWindowsXPHomeEditionSP3 を利用しています(Vistaでも使いたいです)、コードの実行はコマンドプロンプトで行っています

やりたいことは日本語と英語の文字列の含まれたファイルから特定の文字列を正規表現で指定し置換することです
しかし、最初からいきなりつまずいてます
まず、以下のコードが実行できません
puts "あ"

実行すると、"invalid multibyte char (US-ASCII)"と表示されます
rubyのソースコードはUTF-8で保存しています

また、日本語の含まれたファイルを読み込み中身を表示しようとして以下のコードを実行しました
filename = ARGV[0]
puts filename
File.open(filename, "r:utf-8") do |file_input|
file_input.each do |line|
puts line
end
end

しかし、日本語の部分が文字化けして表示されてしまいます(puts filenameの部分は日本語でも正常に表示されます)
ソースコード、読み込むファイルともUTF-8で保存しています、また、読み込むファイルはファイル名に日本語を使っています

基本的な部分かもしれませんが、ネットで検索しても対策が良くわかりません
アドバイスや情報をいただけると助かります、よろしくお願いいたします
175デフォルトの名無しさんsage2009/04/08(水) 20:59:49
>>166
あ、それ逆
「例外 E と変化 C が起きる」場合は
 lambda{ obj.should change(C) }.should raise_error(E)
ではなく
 lambda{ obj.should raise_error(E) }.should change(C)
の順番で書いてくれ
前者は raise_error が満たされた時点で終了してしまって change が検証されないよ

それが証拠に、StringIO#to_s は StringIO オブジェクトを返して change(sio, :to_s) は失敗するはずなのに
何も起こってない
176デフォルトの名無しさんsage2009/04/08(水) 21:00:39
>>174
Ruby1.9.1 をアンインストールして Ruby 1.8.7 を使え
177デフォルトの名無しさんsage2009/04/08(水) 21:00:44
>>174
ttp://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18
マジックコメントを書きましょう
178デフォルトの名無しさんsage2009/04/08(水) 21:11:56
サポートしてくれるものが無い場合は>>176が正解
1.9.1を解説してくれる何かを頼りに学習してる場合はここで躓く可能性はないわけで、
つまりは1.9.1を教えてくれる教科書に該当するものを持ってないってことで
そういう場合は無理せずに1.8.7を使ってRubyに慣れるのが吉

一生のうちに1種類の言語しか学習できない呪いがかかってるとかそういう場合は別途相談
179174sage2009/04/08(水) 21:14:45
レスありがとうございます
>>176
できれば最新版を使いたいのですが、1.8系は1.9系より日本語の使用が楽なのでしょうか?

>177
マジックコメントを記述した結果
puts "あ"
は実行できました!
しかし、残念なたら表示は文字化けしたままです
また、日本語を含むファイルの文字化けも直りません
表示するときに、文字コードを指定するような方法はないのでしょうか?
よろしくお願いいたします
180デフォルトの名無しさんsage2009/04/08(水) 21:21:43
最新版だって判断できるくらいRubyに習熟してるなら自力でやれ
181デフォルトの名無しさんsage2009/04/08(水) 21:24:37
>>179
Ruby1.9では文字列はそれ自身がエンコードを持っていて
入出力などで必要なら自動で文字コード変換が走る
しかし、コンソールへの標準出力では自動変換はなされないので
必要なら(Shift_JIS以外の文字列を出力するなら)自分で変換する(1)
あるいは、自動変換が走るようにIOの設定を変える(2)
のいずれかの対処が必要
らしい

(1)
puts line.encode("Windows-31J")
(2)
$stdout.set_encoding(Encoding.default_external)
$stderr.set_encoding(Encoding.default_external)
182181sage2009/04/08(水) 21:29:30
結果は同じだけど、(1)のほうも
puts line.encode(Encoding.default_external)
のほうがいいかな
183デフォルトの名無しさんsage2009/04/08(水) 21:33:02
>>181
初心者に後者勧めるとかマジキチ
184デフォルトの名無しさんsage2009/04/08(水) 21:40:31
初心者向け書籍は1.9.2になるまで出ないんじゃないかと最近は思う
185174sage2009/04/08(水) 21:59:21
レスありがとうございます
おかげさまで、無事できました

def my_puts str
puts str.encode(Encoding.default_external)
end
なる関数を作成し、putsの代わりに使用しています

これから、日本語を含んだ正規表現の利用を試します
また何かありましたら、よろしくお願いいたします
186デフォルトの名無しさんsage2009/04/08(水) 22:03:12
Windows版のコンソール(cmd.exe?)への出力を諦めれば、相当楽になるような気がする。
例えばファイルにそのまま出すとか。
敢えて茨の道を進む>>185(>>174)に祝福あれ。
187デフォルトの名無しさんsage2009/04/08(水) 22:06:30
1.8.7なら倍のスピードで学習できるけどな
悲惨だ
188デフォルトの名無しさんsage2009/04/08(水) 23:26:28
nkf で変換とかだめなの?
by 初心者
189デフォルトの名無しさんsage2009/04/08(水) 23:36:08
nkfじゃutfがだめじゃない?
190デフォルトの名無しさんsage2009/04/08(水) 23:36:51
UTFも扱えるけど標準出力に書き出すたびにNKF呼ぶんだぞ
死ぬほど面倒じゃないか
191デフォルトの名無しさんsage2009/04/09(木) 00:12:04
>>190
何その Ruby 1.8 以前を全て敵に回した発言
192デフォルトの名無しさんsage2009/04/09(木) 00:42:28
以前と未満を間違えるとプログラムは動かないぞ
193デフォルトの名無しさんsage2009/04/09(木) 01:34:11
<バージョン>Ruby 1.8 <時間>以前
<バージョン>Ruby 1.8 <バージョン>未満
194デフォルトの名無しさんsage2009/04/09(木) 03:04:54
本題とはズレるけど、
cygwin を入れ、cygwin 付属のターミナルを使わずに UTF-8 Teraterm の cygterm で
コンソールを開き、Teraterm のコンソールの出力の文字コード(Kanji (receive) を UTF-8 にすると、
プログラムが UTF-8 で標準出力に出力しても、読めるようになる。

cygwin 入れる場合は、環境変数 PATH で、
cygwin 付属の ruby より mswin32 の ruby の方が前に来るように気をつける。

というか Linux で ruby 勉強した方が余計なところに躓かない気がする。
Linux なら、OS の文字コードも UTF-8 だし。
195デフォルトの名無しさん2009/04/09(木) 08:30:52
a = [1, 2, 3, 4, 5]

# no1 p a.inject(0) do |sum, x| sum += x end
p a.inject(0) { |sum, x| sum += x }

なんでno1では以下のようなエラーが出るんでしょうか?
/tmp/r.rb:20:in `inject': no block given (LocalJumpError)
from /tmp/r.rb:3:in `each'
from /tmp/r.rb:3:in `inject'
from /tmp/r.rb:3
196デフォルトの名無しさんsage2009/04/09(木) 08:41:13
http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#a.a5.d6.a5.ed.a5.c3.a5.af.c9.d5.a4.ad.a5.e1.a5.bd.a5.c3.a5.c9.b8.c6.a4.d3.bd.d0.a4.b7
197デフォルトの名無しさんsage2009/04/09(木) 08:44:38
p するからだ
do〜end ブロックを関数的メソッドに渡したい場合は引数全体を ( ) で括れ
理由は省くが、空白の有無でパースがコケている
198デフォルトの名無しさんsage2009/04/09(木) 09:28:12
do〜endと{}では結合度が違う

do 〜 end → おおもとのメソッドに結びつく
{ 〜 } → 直前のメソッドに結びつく

no1ではブロックがpに結びついてるからだろう
199デフォルトの名無しさんsage2009/04/09(木) 10:27:52
つまり、最初のは

p(a.inject(0)) {|sum, x| sum += x }

と見なされとるわけよ
200デフォルトの名無しさんsage2009/04/09(木) 11:42:51
>>171
> Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
> たとえば、Windows 上で、改行コードが LF のソースを動かす、など。
これは問題ない。
というか標準添付のライブラリはすべてLFになってるはず。少なくとも最新版では。
逆の場合、ruby自身は行末のCRを捨てるという処理が入っているので問題にはならない。
行末以外のCRは単なる空白扱い。
ただし、shebangはruby自身ではなくカーネルで処理されるので、
#!/usr/bin/ruby^M
などとなっていると "/usr/bin/ruby¥r" というコマンドを実行しようとするので動かない。

> もし問題ないのならば、そのままにしてしまおうかなとも考えています
> (sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
つ dos2unix
201デフォルトの名無しさんsage2009/04/09(木) 11:57:14
>>194
いやーそれが、win32のプログラムをcygwin上で動かすと不具合あったりしますよね…。
Ctrl+C押すとcygwinアプリには届くけど、ネイティブアプリには届かずに落ちちゃったり。
(Railsスレにも書きましたけど)

まあ結局は、仮想環境か専用サーバーかのLinuxにターミナルでつなぐか、
coLinux、andLinuxでも入れろやってことになりそうですけども
202デフォルトの名無しさんsage2009/04/09(木) 12:08:53
ひとつ質問いいですか?
kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
けっこう特に後者に(俺が)未だにハマるんですよ。

MLのログみると、trap:kconvにあるような半分バグ的仕様だけど、変更点としては大きいからそのまま、
みたいな感じですが。

kconvで-m0とか-Xはずすような、
モンキーパッチみたいなのってないんでしょうか?
203デフォルトの名無しさんsage2009/04/09(木) 12:21:07
いまだにkconv使ってるやつのほうが博物館行きだからじゃないかな
204デフォルトの名無しさんsage2009/04/09(木) 12:32:04
> kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
x nkf の -m0(MIMEデコード)
o nkf の -m(MIMEデコード)

>>203
ええええ('A`)
なら、String.toutf8 みたいなユウワクに駆られるようなメソッド用意しとくんじゃねーよヽ(`Д´)ノ ウワァァン!!
205デフォルトの名無しさんsage2009/04/09(木) 14:24:57
>>200
レスどうもありがとうございます。参考になりました。
改行コードが混在したソースの状態でも、とりあえず問題なく動くということで安心しました。

shebangの問題は大丈夫です。
今回はRails + Rubyによるバッチで、Linux上で shebang で起動される
ソースは、ただしく LF になっていました。
206デフォルトの名無しさんsage2009/04/09(木) 15:15:05
すごい初歩的な質問です。

ttp://www.ruby-lang.org/ja/man/html/Hash.html を読むと、default を持たなければ nil を返すとのことなので、

h = {}

if h['a'].nil?
  p "ok"
else
  p "ng"
end

は ok が出て分かりますが、

if h['a']['b'].nil?
  p "ok"
else
  p "ng"
end

は  undefined method `[]' for nil:NilClass (NoMethodError) になります。
これを ok に出すにはどう書けばいいのでしょうか?
207デフォルトの名無しさん2009/04/09(木) 15:17:53
if h['a'] && h['a']['b'].nil?
  p "ok"
else
  p "ng"
end
208デフォルトの名無しさんsage2009/04/09(木) 15:28:12
もうこれは100回でも書こうと思う

Ruby に 2次元配列(そして多次元配列)は存在しない
a[0][1] は「2次元配列 a の 0, 1 番地」ではなく
配列 a の [] メソッドに引数 0 を渡した返り値のオブジェクトの [] メソッドに引数 1 を渡した返り値、
すなわち

  tmp = a[0]
  tmp[1]

という2段階のアクセスを縮めたもの、または単なる

  a.[](0).[](1)

というメソッドチェーンだ
209デフォルトの名無しさんsage2009/04/09(木) 15:31:50
しかし誰も配列の話はしていなかった
210デフォルトの名無しさんsage2009/04/09(木) 15:36:17
>>209
現象は一緒じゃん
要はメソッドチェーンが切れてるだけだし、メソッドチェーンのレシーバがnilになりうるときと対処が全く同じ

n次元配列のクラスを標準で添付しなかったのは悪意だと思う
211206sage2009/04/09(木) 15:53:32
>>207-210
ちょっと衝撃的な事実。大変勉強になりました。

多次元がなく、判定が if h['a'] && h['a']['b'].nil?  と煩雑としたら、
多次元を扱わない別の方法でデータを扱っているんですか?
212デフォルトの名無しさんsage2009/04/09(木) 15:54:00
けっこういろんな人が困ってるな、2次元構造のコレクションの nil 問題
「データに nil があるとエラーになります」とか苦しい説明をしてる人も…
213デフォルトの名無しさんsage2009/04/09(木) 15:57:02
デフォルトでおすすめできる多次元配列のライブラリもないしな。
214デフォルトの名無しさんsage2009/04/09(木) 16:04:49
>>211
概念的にも構造的にも多次元ではないので「配列のネスト」「ネストしたハッシュ」などとお呼びくださいまし

で、Ruby ではいわゆる番地でコレクション(配列、ハッシュ)にアクセスすることはそう多くない
コレクションの each メソッドを使って枚挙するか、そういうアクセスを基本としてデータ構造を考える

んが、配列のインデックスやハッシュのキー決め打ちでネスト先にアクセスすることも多くて、
「あ、そうか、最初のが nil になればこれってエラーか、めんどくさいなあ」と言って
h[key1][key2] が h[key1] && h[key1][key2] になるのは日常茶飯事

だから、もし、本当に、番地による多次元アクセスが大量でメインな仕事をするつもりなのなら、Ruby は使わないほうがよい
215デフォルトの名無しさんsage2009/04/09(木) 16:05:46
ここでサクッと2次元配列みたいに扱うハックがキボン
216211sage2009/04/09(木) 16:09:40
>>214
ひやー。パラダイムシフトが求められるのですね。
ありがとうございます。
217211sage2009/04/09(木) 16:15:20
僕もハッカー待ちます><
218デフォルトの名無しさんsage2009/04/09(木) 16:31:37
def nested_fetch(array, *indexes, &ifnone)
 ifnone = lambda{|idx| return } unless block_given?
 indexes.inject(array){|ary, idx| ary.fetch(idx, &ifnone) }
end

こんなん?
219デフォルトの名無しさんsage2009/04/09(木) 16:32:28
h = {}
h['a']['b'] = "hello"

をする定石はなんでしょうか?
220デフォルトの名無しさんsage2009/04/09(木) 16:37:57
誰でもわかる勘違いのない方法

h = {'a' => Hash.new}
h['a']['b'] = "Hello"

「ハッシュにあるキーでアクセスしてキーが存在しなかった場合、特定のオブジェクトを代わりに作ってそのキーに対する値とする」
という動作をさせることもできるが、読むのめんどい
どっかで書いたので誰かが書くと思う
221デフォルトの名無しさんsage2009/04/09(木) 16:42:26
自動でHashをネストしてもらう
 h = Hash.new{|t, k| t[k] = {} }

登録してないkeyだと確認して自分でHashを入れる
 h = {}
 (h['a'] ||= {})['b'] = "Hello"

あらかじめ一段目のkeyを知っている
 h = {}
 ['a', ...].each{|k| h[k] = {} }
 h['a']['b'] = "Hello"

だいたいこのどれか。
イメージするデータ構造によって好きなのを選んでくれい。
222デフォルトの名無しさんsage2009/04/09(木) 16:43:35
あーあった

h = Hash.new{|h,k| h[k] = Hash.new}
h['a']['b'] = "Hello"
p h
p ['undef']['unset']
p ['undef2']

結果
{"a"=>{"b"=>"Hello"}}
nil
{}

ただ、おそらく、多くの場合、Ruby でこれを使うのはそもそも間違いで、
データ構造を考え直したほうがよいとは思う
223デフォルトの名無しさんsage2009/04/09(木) 16:45:34
>>220
早速ありがとうございます。その「ハッ(略」にも興味があります。

それは

h = {'c'=>"aa"}
h['a']['b'] = 'hello'

の場合、h['c'] を消さない方法でしょうか?
224218sage2009/04/09(木) 16:45:58
連投すまん。こんなんとか。

def nested_fetcher(collection, n_dimension)
 lambda{|*keys, &ifnone|
  ifnone ||= lambda{|idx| next }
  keys.size == n_dimension or
   raise ArgumentError, "wrong number of arguments (#{keys.size} for #{n_dimension})"
  keys.inject(collection){|c, k| c.fetch(k, &ifnone) }
 }
end

ifnoneを渡さないならブラケットで見た目的にも。
f = nested_fetcher(array, 2)
f[0, 0]
225223sage2009/04/09(木) 16:47:52
>>220-222
ありがとうございます!

>>221 の方法で >>223 は実現できたので取り下げます。

うーん。確かにどれも直感的な方法ではないので、別のデータ構造を考えます。
226デフォルトの名無しさん2009/04/09(木) 16:48:29
ハッシュを構造体の代わりとして用いることは
是か否か、について教えてくさい。
227デフォルトの名無しさんsage2009/04/09(木) 16:50:52
メンバが有限ならStruct、そうでないならHashという私見です。
228デフォルトの名無しさん2009/04/09(木) 16:55:00
とりあえず否

構造体用のクラスがRubyには用意されているため。

これが満足できない回答なら、情報小出しにすんなといいたい
229デフォルトの名無しさんsage2009/04/09(木) 16:56:30
>>226
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'‾/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

他の言語の構造体に完全に該当するクラスはRubyにはない
>>227のように Struct が標準でついてくるが、
ぶっちゃけ「つけた名前のメソッドでもアクセスできるなにやら便利な配列」以上の使われ方はしないので好きにしれ
Struct を使って怒る人は特にいない
230デフォルトの名無しさんsage2009/04/09(木) 16:58:32
h = {'c'=>"aa"}
(h['a'] ||= {})['b'] = "Hello"

がうまくいったので、

h = {'c'=>"aa"}
ha(h, 'a', 'b', 'hello')

したら

{'a'=>{'b'=>'hello'}, 'c'=>'aa'}

が返ることを期待して

def ha(h, a, b, key)
  (h["#{a}"] ||= {})["#{b}"] = key
end

としたのですが結果が hello です。
なぜでしょうか。。。
231デフォルトの名無しさん2009/04/09(木) 16:59:09
[ 0, 0, [] ]

こういうのがあってイラっとした。
しかもコメントがない。死ね。
232デフォルトの名無しさんsage2009/04/09(木) 17:02:15
haの返り値は最後に評価された式つまりその代入式の値。
代入式の値は右辺の値。
早とちり乙。hはちゃんと変わってるはず。
233デフォルトの名無しさんsage2009/04/09(木) 17:03:33
>>230
よくわからないものを無理して使うからよ
234デフォルトの名無しさんsage2009/04/09(木) 17:05:48
>>233
自分で泥臭くでも作れば間違いないのにね
借り物を使うから、どう動作してるのかがわからなくなる…
235デフォルトの名無しさんsage2009/04/09(木) 17:07:42
イディオムを教えるっていうのは、それを分解して
どういう動作なのか調べて自分の肉として取り込んでもらうってことだと思ってた。
236230sage2009/04/09(木) 17:08:49
>>232-233
ほ、本当だー。ありがとうございます。

Perl/PHP と比べると不思議ですが、面白いですねー。
>>221-222, 224 などなど理解できてないので精進しますです。
237デフォルトの名無しさんsage2009/04/09(木) 18:45:05
>>202
お前は俺か、ってくらい、昨日同じことで悩んでた。

>>203
今は何使うのが常識なのか教えてー。 1.8.x で。
238デフォルトの名無しさんsage2009/04/09(木) 18:53:58
常にh['a']['b']などと二段階でしかアクセスしないなら、そもそもHashをネストさせる意味はない。
h[['a', 'b']] = "Hello"
とでもしとけ。
239デフォルトの名無しさんsage2009/04/09(木) 18:58:03
うわぁ・・・
240デフォルトの名無しさんsage2009/04/09(木) 19:10:01
ベンゾウさんの中・・・
241デフォルトの名無しさんsage2009/04/09(木) 19:21:44
>>238
rails の select ヘルパーが