09/04/02 09:43:25
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?
A:
プログラム作成自体の初心者なら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
「初めてのRuby」
URLリンク(www.amazon.co.jp)
以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください
「Rubyレシピブック 第2版 268の技」(初心者向け)
URLリンク(www.amazon.co.jp)
「プログラミングRuby 第2版 言語編」(初心者向け)
URLリンク(www.amazon.co.jp)
「Ruby Way 第2版」(脱初心者向け)
URLリンク(www.amazon.co.jp)
「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
URLリンク(www.amazon.co.jp)
以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません
「プログラミング言語 Ruby」(言語として深く知りたい人向け)
URLリンク(www.amazon.co.jp)
3:1様
09/04/02 09:45:06
Ruby 公式・非公式便利サイト2009
Ruby Home Page 【公式、お役立ち度が微妙】
URLリンク(www.ruby-lang.org)
Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) 【詳しい英語版】
HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
URLリンク(elbereth-hp.hp.infoseek.co.jp)
Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
URLリンク(www.ruby-doc.org)
Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
URLリンク(jp.rubyist.net)
逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
URLリンク(www.namaraii.com)
はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
URLリンク(d.hatena.ne.jp)
RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
URLリンク(www.rubyforge.org)
GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
URLリンク(github.com)
日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
URLリンク(jp.rubyist.net)
4:1様
09/04/02 09:46:21
関連スレ
本スレ
Rubyについて Part 35
スレリンク(tech板)
アンチスレ
Rubyについて(アンチ専用) Part003
スレリンク(tech板)
Railsスレ
【Ruby】Ruby on Rails Part6
スレリンク(php板)
Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)
Ruby 1.9 系列スレ
魁け! Ruby 1.9.X
スレリンク(tech板)
5:デフォルトの名無しさん
09/04/02 13:07:16
英語板に振ったアホがいるが、これは単なる技術英語なので、文法論は意味がない
命令文でもないのに Abort. と表示されるのはおかしいなんて指摘しても意味があるまい
6:デフォルトの名無しさん
09/04/02 13:16:41
>>5
(前スレ質問再掲)
> □ 996 デフォルトの名無しさん [] 2009/04/02(木) 12:43:26
>
> 英語のエラーメッセージで
> 「not found, ignored.」
> のような、かなりシンプルな構文で書かれることがありますが、これを英文法
> 上の用語でなんと言いますか?
>
> また、これについて勉強できる書籍(など)があれば教えてください。
どう見ても英文法の質問です。本当に(ry
真面目な話、このスレよりはスレ違いじゃなかろうと思ったんだが、まずかったらすまんかった。
7:デフォルトの名無しさん
09/04/02 13:23:18
そういやクラスやメソッド名を英語で付けようとして困ったということがよくあるなあ
みなさんどうしてますか?
8:デフォルトの名無しさん
09/04/02 13:24:37
エスパーするなら
「こういうのどうやって書いたらいいかわからないので調べたいです、必要な用語を教えてください」
だと思うけどね
文法書レベルの用語を知るためだけに質問したとは思えねー
どう書くかというのは、もう英語のソースや技術文書読むしかないな
なるべく大きなプロジェクトのもの
技術文書に関しては企業プロダクトのものが好ましい
技術英語と略語掲示文を解説した本には実は心当たりがあるんだが、見つかんねえ
無理してでも買っておけばよかった
9:デフォルトの名無しさん
09/04/02 13:28:27
○○体とか言うんじゃなかった?
まあ英文法書にはのってねーだろ普通。文系は帰れよ。
10:デフォルトの名無しさん
09/04/02 13:33:15
English板に振るほど板違いではないが、Ruby固有の問題でもないので掘り下げるのはスレ違いかなーという感じだな
ネイティブを真似っこするしかあんめえ
11:デフォルトの名無しさん
09/04/02 13:46:19
>>7
その手のスレはム板に専用のがちゃんとあるよん
ソースのコメントを英語で書くスレ
スレリンク(tech板)
クラス名・変数名に迷ったら書き込むスレ。Part14
スレリンク(tech板)
12:デフォルトの名無しさん
09/04/02 13:51:41
>>11の上で似たような話題が出てるね
ソースのコメントを英語で書くスレ
スレリンク(tech板:563番)
> 関数やメソッドの説明って主語の this function とか this method とかが省略されて
> 動詞から始まることが多いんだけど、色々調べてみるとその動詞に
> ...
13:11
09/04/02 14:06:43
それ質問してるの俺だからw
14:デフォルトの名無しさん
09/04/02 14:08:45
>>11-12 が(実用度的に)ベストアンサーっぽい?
質問の答えとしてまとめてみると、
・エラーメッセージは文法を崩していることもある
・エラーメッセージとしての慣習や慣用的な言い回しがあり、それらには英文法上の呼び名があるときも無いときもあるだろう
・勉強するならむしろ技術書を当たった方がいい?(エラーメッセージのガイドライン等)
ってこと、かな?適当なので訂正よろ。
15:デフォルトの名無しさん
09/04/02 14:32:28
>>13
ワロタ
このリンクは収穫だったわ
URLリンク(java.sun.com)
16:デフォルトの名無しさん
09/04/02 17:15:51
むしろ松本教祖の英語力に疑問があるけどな。
17:デフォルトの名無しさん
09/04/02 17:46:25
あんま関係ないかも知れんが、
俺他人にプログラミングを教えるときは、メソッド名とかを
あえて日本語ローマ字で書いてる。 (def shokika とかね。)
初心者のうちは、どれが自分で作ってる部分でどれが言語仕様なのか
区別つかんだろうなーと思って。
(ダサさ満点だけど)
18:デフォルトの名無しさん
09/04/02 19:36:39
>>17
それ公開されているプログラムでも見たことがある。
p2とか見てみなよ面白いからw
19:前スレ751
09/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:デフォルトの名無しさん
09/04/02 19:47:41
引数としてもらったブロックを他のメソッドのブロックとして渡す、ということは可能なのでしょうか?
ブロックを持つメソッドのラッパーなどを作った場合に、どうしたものかと。
今は、Procで受け取って、メソッド呼び出し時にわざわざブロックを作ってその中で Proc.callしています。
以下のような感じです。
def open_from_nantoka(filename, &block)
open(filename) {|f| block.call(f) }
end
21:デフォルトの名無しさん
09/04/02 19:54:05
def open_from_nantoka(filename, &block)
open(filename, &block)
end
22:デフォルトの名無しさん
09/04/02 20:00:10
>>20
普通に
open(filename, &block)
でいけると思うんだけど。
$ irb
irb(main):001:0> p = lambda { puts "hoge" }
=> #<Proc:0x7ff9c264@(irb):1>
irb(main):002:0> 3.times(&p)
hoge
hoge
hoge
=> 3
23:デフォルトの名無しさん
09/04/02 20:45:46
>>21-22
ありがとう。& つければよかったのか…
マニュアルでは "ブロック付きメソッド呼び出し"のところにありました。
24:デフォルトの名無しさん
09/04/02 20:48:09
まー単純なクラスとメソッドの説明に乗らないそのへんはマニュアル一通り読んでもらわないとわからんな
25:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/02 21:23:03
class Symbol
def to_proc
lambda{|receiver, *args| receiver.__send__(self, *args) }
end
end
みたいなもんだから。
レシーバは既に知ってるMethodの代わりにはならないんじゃないかと。
27:デフォルトの名無しさん
09/04/02 21:58:30
a(:puts.to_proc) は、self.puts() という意味になっちゃうから、
でもってこれはinclude KernelしているObject#puts()だから、
改行して終了ということだな。
28:デフォルトの名無しさん
09/04/03 00:13:40
LAMPという言葉がキモくて仕方がありません。
いったい誰がこのような言葉を広めたのでしょうか。
流行?
web2.0と同じくらい下らない。
そもそもこの言葉使いますか?
「おし、じゃあサクっとLAMP環境構築しておいてよ」
「これからはPHPだよな。LAMPさいこー」
なんて言いますか?
こんなキモい言葉が港では当然のように使われているのが許せません。
早く死語になりますように ><
29:デフォルトの名無しさん
09/04/03 00:20:23
Rubyが先に死なないようにしないとね。
30:デフォルトの名無しさん
09/04/03 00:24:57
LAMP には別に正負どっちの感も持たないけど
>>28はうっとおしいと思った。
31:28
09/04/03 00:30:31
見ておくれ、このひどい有様を!!
URLリンク(ja.wikipedia.org)
構成要素に応じてAMP、LAPPのように言葉も変わっている類似用語があげられてる。
これこそまさにキモい!
なにコイツらって感じ。
「俺は面白い言葉遊びを考えたんだぜ~」とか思ってるのか?
そして「は?LAMPも知らないの?」と、知っていて当然のように喧嘩売ってくる奴は、きっとこの言葉遊びの工作員だから、いっしょに死んで欲しい。
32:デフォルトの名無しさん
09/04/03 00:32:11
港でlampが使われるのは用途あってのことだろうしどうでもいいだろ
33:デフォルトの名無しさん
09/04/03 01:19:27
マカだと、MAMPとか逝ってるしな。リナックスでいいだろと思う。
34:デフォルトの名無しさん
09/04/03 01:27:59
うーん、微妙だ
URLリンク(www.google.com)
35:デフォルトの名無しさん
09/04/03 04:07:39
結局>>28自身がキモイだけだったな。
36:デフォルトの名無しさん
09/04/03 08:08:04
/ニYニヽ
(ヽ /( ゚ )( ゚ )ヽ /)
(((i ) /::::⌒`´⌒::::\ ( i))) でっていうwwwwwwwwwwwwwww
/∠_| ,-)___(-,|_ゝ \
( ___、 |-┬-| ,__ )
| `ー'´ /´
| /
37:デフォルトの名無しさん
09/04/03 10:22:11
_, ._
( ・ω・)
○={=}〇,
|:::::::::\, ', ´
、、、、し 、、、(((.@)wwwwwww
38:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/03 12:20:45
明示的に初期化しましょう、で終了
40:デフォルトの名無しさん
09/04/03 12:22:04
初期化(笑)
41:デフォルトの名無しさん
09/04/03 12:24:11
attr_accessorが作るのはメソッドであって変数そのものではないのだが
なにか勘違いしてるんじゃないだろうか
42:デフォルトの名無しさん
09/04/03 12:28:39
p @hoge
と
@hoge=nil
p @hoge
が状態が違うというのはあまり好きではない
オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする
43:デフォルトの名無しさん
09/04/03 12:42:50
>>26-27
ありがとう。
なるほど、receiverはself固定なのね
やっぱ代わりにはならないか
Kernel.method(:puts)が書きずらいなーと思ったので、
:Kernel.puts.to_proc ってまあ、無理かw
44:デフォルトの名無しさん
09/04/03 12:45:18
>>28 じゃないけど、職場でLAMPって言葉使ったら、m9(^Д^)プギャー!!されてしまった。
そんな言葉、聞いたことないよ、と
用語説明しても、それは単にソフトウェアの構成のことであって、うんぬん
45:デフォルトの名無しさん
09/04/03 12:51:15
Wintelみたいなもんだろ?>LAMP
言葉は知ってても使わない、っていう人も多いだろうし、知らない人は知らないし。
言葉だけではとくに m9(^Д^)プギャー!! されるもんでもなかろう
使い方じゃね?
46:デフォルトの名無しさん
09/04/03 12:51:38
>>42
いきなり
if @name.nil? then
@name = '上戸彩'
end
とかできないのか
全部initializeで初期化するべきだな
47:デフォルトの名無しさん
09/04/03 12:56:07
>>46
こういうときって defined? と nil? 両方でみるべきなのかね
if defined?(@name) || @name.nil?
@name = "mage"
end
いや、やっぱinitializeでnil初期化がらくだ
48:デフォルトの名無しさん
09/04/03 12:58:14
attr_accessor に、全部nilで初期化ってくらいのオプションがついててもいいと思うんだ。
どうせsyntax sugarなんだから。
49:デフォルトの名無しさん
09/04/03 12:59:37
>>44
知らない奴が知ってる奴に「m9(^Д^)プギャー!!」するのは何かおかしいだろう。
まあ知ってるからどうだという言葉ではあるが。
50:デフォルトの名無しさん
09/04/03 13:17:46
>>46
@name ||= '上戸彩'
>>42は = で代入が行われてないインスタンス変数は instance_variables に登録されないとかなんかその辺の話だろう
どちらも nil を返すが後者はインスタンス変数が存在していると
51:デフォルトの名無しさん
09/04/03 14:08:33
>>50
なんでだよw
@is_man = false
@is_man ||= true
p @is_man => true
「||=」と「if xxx.nil?」は違う
52:デフォルトの名無しさん
09/04/03 14:13:06
>>51
50じゃないけど慣用句的に使ってたよ('A`)
nilじゃないときは代入、みたいに
53:デフォルトの名無しさん
09/04/03 14:16:03
falseが入ってこないという仕様ならいいと思う
ただ完全な置き換えではないということは知っておかないと、
リファクタリングのときとか微妙に挙動を変えることになるかもね。
微妙なのがわかりづらい。あからさまなのはわかりやすい。
54:デフォルトの名無しさん
09/04/03 14:23:51
FlaseClass のオブジェクトがどこからともなく入ることはそもそもありえないだろ
55:デフォルトの名無しさん
09/04/03 14:41:12
Flase
落ち着け
つ旦~
56:デフォルトの名無しさん
09/04/03 14:53:44
>>54みたいに間違いを指摘されると意固地になるやつって面倒なんだよな
指摘しないと仕事にならないときとか困る
やんわり言ってもやんわり意固地になるし・・・どーすりゃいいのよ
57:デフォルトの名無しさん
09/04/03 15:35:31
>>56
>>46が @name == false をチェックしてないということ自体が答だろ
false はこの場合「入るはずがない」のが前提
nil? メソッドを defined? でチェックしてないのと同じ
58:デフォルトの名無しさん
09/04/03 15:50:59
もしfalseが入ってるなら上書きしちゃまずくないか?
という流れじゃないのか?おれの勘違いだったらスマン
59:デフォルトの名無しさん
09/04/03 16:01:17
false の時は動作しないだろ、という突っ込みが文脈上無意味またはオタ臭い重箱隅つつき、というようなアリガチな話だと思った
60:デフォルトの名無しさん
09/04/03 16:05:14
>>46
できる。未定義のインスタンス変数を参照するとnilが返るから。
でもって>>50が
@ivar ||= val という書き方を提案した。
これは @var = val unless @ivar みたいなもんなので
>>51が@varがfalseでも上書きしちゃうぞ、と突っ込んだ
61:デフォルトの名無しさん
09/04/03 16:10:23
DBのブール型を普通に使ってるおれは興味深かったが、
true/falseを変数に入れるって使わないやつは使わんのかね。
62:デフォルトの名無しさん
09/04/03 16:14:19
>>60
>>42をよく嫁よ
オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする
63:デフォルトの名無しさん
09/04/03 16:47:54
>>46からの流れだよ。
>>42の意見はどーでもよかったから省いた。
そんな仕様だったら死ぬ。
64:デフォルトの名無しさん
09/04/03 16:56:18
>>40
なにが(笑)なのかkwsk
65:デフォルトの名無しさん
09/04/04 00:20:16
普段pythonを使ってるのですが
rubyとの対応表みたいなのがあるサイトはないでしょうか
rubyを手間かけないで覚えたいのです
66:デフォルトの名無しさん
09/04/04 01:08:47
>>65
URLリンク(pub.cozmixng.org)
67:デフォルトの名無しさん
09/04/04 19:16:07
あ
68:デフォルトの名無しさん
09/04/04 22:44:13
Hikiって文書の中にRubyのスクリプト埋め込んだりできないの?
69:デフォルトの名無しさん
09/04/04 23:04:56
Wikiの文書にサーバーで動作可能なスクリプトを埋め込めるとか怖過ぎるだろ…
70:デフォルトの名無しさん
09/04/04 23:06:19
Hiki公開しちゃダメ
71:デフォルトの名無しさん
09/04/05 04:39:49
URLリンク(asobi.sqweebs.com)
質問用テンプレ作りました。
72:デフォルトの名無しさん
09/04/05 09:48:03
テンプレ作ってくれて助かるが、webサービスにする必要あるのか?ww
73:デフォルトの名無しさん
09/04/05 09:49:12
>>71-72
せっかくなのでテンプレコピペ(ちょい修正)
◆質問用テンプレ
【詳しい内容(「動きません」「うまくできません」だけでは回答しにくい)】
【エラーメッセージ(自力で訳さずなるべくそのままで)】
【実行環境(OS名、Rubyのバージョン(ruby -v しる)】
【最終的にやりたいこと(もっとよい方法がある場合が多いため)】
74:デフォルトの名無しさん
09/04/05 10:16:28
>>71
乙、しかし Rubyで作れw
75:デフォルトの名無しさん
09/04/05 10:24:31
ランダムディレクトリ名でランダムファイルのCGIはアクセス解析とスパイウェア注入と相場が決まってる
アクセスしたお前らオタワ\(^o^)/
76:デフォルトの名無しさん
09/04/05 10:38:13
Rubyスレに貼られるPHPのCGIなんざ俺が踏むわけねーだろ
77:デフォルトの名無しさん
09/04/05 13:44:32
外部コマンドを一定時間実行して実行を打ち切るのってどうすればいいですか?
なんとかBSDでのTS抜き環境が出来てddコマンドでUSBデバイスからコピーすればデータが流れてくるようになりました。
停止しなければ延々放送波が流れてくるので、CTRL+Cで停止する必要があるのですが、
rubyでラッパーを書いて利用する際にどうすれば時間指定を出来るのかと思った次第です。
78:デフォルトの名無しさん
09/04/05 13:50:00
Rubyあんま関係ないな
システムコールとか勉強するといいぞ
時間指定は cron とかの外部スケジューラに任せるのが一般には間違いない
79:デフォルトの名無しさん
09/04/05 14:00:22
さっぱり分からんがスレッド使って時間をみたりするのはダメなのか?
80:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/05 14:28:09
>>79
個々のスクリプトとしては sleep するしかないので、正直あんまりよくはない
自分の見てる前で30分だけ動かすとかそういうのならいいけどさ
82:デフォルトの名無しさん
09/04/05 21:04:00
OpenStructクラスで、[]、[]=、count(from Enumerable)などのメソッドを使いたいのに
定義されていない場合は、OpenStructを継承して派生クラスで定義してくれってことですか?
83:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/05 21:48:40
>>82
他にどーしろと…
st[0] でも st[:hoge] でも st.hoge でも st.each でもアクセス可能なコレクションというのは
デフォルトでは添付されてない
どれか諦めてくれ
85:77
09/04/05 22:44:07
>>80 >>83 有り難うございます
別のプロセスをforkで作り、子供側にはnilを返し親にはpidを返すので
下に分岐を入れて子供には外部コマンド実行、親にはスリープしたのちkillさせる、ってことですね。
確かにrubyはあんまり関係ない処理だなあ・・・。unixの勉強がいるなあ。
86:デフォルトの名無しさん
09/04/05 22:45:57
>>83
pid = fork {exec('...')} とブロックのほうがいいんじゃまいか
1.9ならspawnがあるんだが。
87:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/06 01:21:04
クラス名を文字列で受け取ってnewしたいとき、どのようなコードになりますか。
いろいろ試してみたけど最終的にはシンプルにevalしか思い当たらないんですが、漠然と他にありそうなような。
classname = "SomeClass"
require classname #ファイル名とクラス名が同じと仮定した場合
obj = eval("#{classname}.new")
89:デフォルトの名無しさん
09/04/06 02:36:15
>>88
classnameが::を含まない前提?
> require classname #ファイル名とクラス名が同じと仮定した場合
普通は require classname.downcase
> obj = eval("#{classname}.new")
obj = Object.const_get(classname).new のほうが速い
active_supportあたりにそんな機能があるよ、確か。
90:88
09/04/06 06:20:11
>>89
ありがとうございます!
>>88の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため
evalしかダメでした。(evalした時点で暗黙に読み込まれる)
const_getだと、すでに読み込まれている定数に対してですが、
そのことに気づかずにあれやこれやと・・・orz
現在は修正してうまくいっています。
active_supportは使えない環境なんですが、ファイル名のことなども参考になりましたm(_ _)m
91:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/06 18:37:54
Rubyプログラミング入門 ?はじめてのプログラミング、はじめてのRuby
URLリンク(www.bnn.co.jp)
サンプルコードを読む限りはまー最初ならこんなもんじゃねーの、と思った
少なくとも同時期のナントカの冒険よりは読む価値があると思う
サンプルコードのダウンロードURLが書いてあったんだけど
まさかサイトに書いてない購入者限定の代物だとは思わなかったので記憶してくるの忘れた
サンプルコード公開すれば売上伸びる系統の本だと思うのに
93:デフォルトの名無しさん
09/04/06 19:10:52
Rubyの冒険とかめちゃくちゃ懐かしいんだが
それとは関係ないんだな
94:90
09/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
95:90(続き)
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/06 21:19:21
>>96
Railsのライブラリで定義されてるメソッドの話はスレ違い
【Ruby】Ruby on Rails Part6
スレリンク(php板)
98:96
09/04/06 21:24:10
>>申し訳。
そっちで聞いてみます。
99:デフォルトの名無しさん
09/04/06 21:27:17
スレ的にはRailsをRuby初学者が使うのは全くお勧めしない
100:デフォルトの名無しさん
09/04/06 22:46:32
「Rubyレシピブック 第2版 268の技」を買いたいと思ってるんですが
レシピブックって言うのはもっといたほうがいいんですかね?
言語挫折厨なもんで、、、便利なら買いたいと思っています。
101:デフォルトの名無しさん
09/04/06 22:52:58
>>100
対象がほんのり古いが、「Rubyは実際にどう書くのが一般的と考えられてるのか」がたくさん載っててとても便利
95%くらいは今でも使える、基本ライブラリを使うときはこう書いておけばとりあえずは恥ずかしくない、というコード片が満載
独学可能な領域なので無理してまで買わなくてもいいが、買うと勉強が早く済むよ
102:デフォルトの名無しさん
09/04/06 22:56:49
間違いなく買い
初版持ってるけど、よれよれになってるよ
103:デフォルトの名無しさん
09/04/06 22:58:48
ありがとうございます、買い、みたいですね。
参考にさせていただきます。
104:デフォルトの名無しさん
09/04/06 23:17:10
WindowsのRuby/TKで簡単なランチャを作って使ってるんですが
Rubyから別コマンドを実行するのがsystemしかなく
ふつうにsystem使うと、コマンド終了待ちでRubyが止まっちゃうので
Thread.new{system 'ほげほげ.exe 引数'}
としてます
外部コマンド一つ起動するごとにスレッドが増えるけど
外部コマンドが終了すればスレッドも終了するだろうし
同時に起動することなんて多くても数十程度だろうから
大丈夫かなと
forkしてexecするのが普通の同期しない外部コマンド起動のさせかたなんですか?
Windowsなんでforkできないのです
1.9だとspawnが使えるんですけど
105:デフォルトの名無しさん
09/04/06 23:30:02
>>104
win前提ならstartコマンド経由で呼べばすぐ戻ってくる
system "start ruby -e 'sleep 10'"
106:デフォルトの名無しさん
09/04/06 23:35:32
startはcmd.exeの内部コマンドなので
GUIから呼ぶと一瞬cmd.exe起動の為に
コマンドプロンプトウィンドウが出てしまうのです
rubyw -e "system('start winver')"
とかするとわかります
107:デフォルトの名無しさん
09/04/06 23:47:02
>>106
これはどうよ?
require 'win32ole'
wsh = WIN32OLE.new('Wscript.Shell')
wsh.Run('cmd /c echo', 0, false)
108:デフォルトの名無しさん
09/04/06 23:51:39
ああ、wsh 厨が来た
ってか Windows の cmd.exe の肝心なときに使えない度は異常
109:デフォルトの名無しさん
09/04/07 00:11:46
>>106
忘れてたorz
Thread.new{system 'ほげほげ.exe 引数'}.kill
というのは?スレッド殺してもプロセスまで殺さないはず。
110:デフォルトの名無しさん
09/04/07 00:19:59
>>108
ゲイツソフトに無理言うなよw
111:デフォルトの名無しさん
09/04/07 00:26:10
win32api使えばいいんじゃ
URLリンク(d.hatena.ne.jp)
112:デフォルトの名無しさん
09/04/07 00:51:25
ちゃんとするならWin32APIなんでしょうね
でも、お手軽じゃないなぁと
Thread.new{system 'hoge.exe'}
で、動いちゃってるので
まあいいかなとそのままです
>>109
すいません
私の場合は非同期に外部コマンドを起動したいだけなので
後々のコントロールできなくてもよいのです
でも、Windowsで >>77 みたいなことをRubyにさせようとすると
どうすればいいのでしょうね
Win32APIを駆使?
めんどくさそうだなぁ
113:デフォルトの名無しさん
09/04/07 01:17:57
>>112
CreateProcessするんじゃね?
使ったことないけど
114:デフォルトの名無しさん
09/04/07 09:31:01
1.8で、コマンドプロンプトを見せるな、という制限を課されるといろいろつらいな。
CreateProcessなりShellExecute(Ex)なりを直接叩くしかないと思う。
115:デフォルトの名無しさん
09/04/07 09:36:05
IO.popen(program, "w") とか
116:デフォルトの名無しさん
09/04/07 13:30:59
すみません。Cで拡張ライブラリを書くためにREADME.EXT.jaを
読んでいるのですが、次のような箇所があります。
> 既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を
> 使えば,Rubyの機能を実現している関数を直接呼び出すことが出来
> ます.
> # このような関数の一覧表はいまのところありません.ソースを見
> # るしかないですね.
これが書かれてから15年近く経った今でもそうなんでしょうか?
日本語・英語問わず、どこかに一覧表があれば欲しいのですが・・・。
117:デフォルトの名無しさん
09/04/07 18:07:07
rspec で BDD だとかなんかそんなのやってみようかなーと思ってるんだけど、
これってパブリックなメソッドの返り値しかチェックできないの?
いくつも小さなメソッドに分割された、ある程度フクザツなメソッド作ってる最中は役に立たない?
118:デフォルトの名無しさん
09/04/07 18:22:29
>>117
逆
「作り始め」のメソッドの大きさはみんな一緒
119:デフォルトの名無しさん
09/04/07 18:34:39
tdiary 以外でテーマやスキンの充実した ruby アプリって何かありませんか。
120:デフォルトの名無しさん
09/04/07 19:31:53
Hiki
121:デフォルトの名無しさん
09/04/07 19:34:59
>>116
スレ違い
122:119
09/04/07 19:55:35
tdiary と同じテーマやスキン以外でお願いします><
MT や WP、Xoops みたいにド派手に変えられると嬉しいです。
Ruby ベースの CMS
URLリンク(diaspar.jp)
をみてもテーマ公開しているの少ないよね…。
123:デフォルトの名無しさん
09/04/07 20:01:41
>>117
RSpecでテストとか勉強しようと思ってずっと待ってるんだけど、そういう解説は見たことないね
なんかテストのなんたるかを知ってる人が自由に使ってる感じがして、ちょっと寂しい
個々のマッチャとかの動作はわかりやすいんだけど、実際にこれどう使うのよみたいな
124:デフォルトの名無しさん
09/04/07 22:08:10
モデル・ビュー・コントローラの知識がないとたぶんダメ
125:デフォルトの名無しさん
09/04/07 22:27:18
>>122
PinkyBlog
126:デフォルトの名無しさん
09/04/07 22:29:47
>>123
TDDは俺もよくわからんので勉強中。
書籍だと「10日でおぼえる Ruby on Rails入門教室」がTDDやりながら開発する解説があるらしい。
rspecかどうかはわかんないけど
Amazon.co.jp: 10日でおぼえる Ruby on Rails入門教室: arton: 本
URLリンク(www.amazon.co.jp)
URLリンク(images-jp.amazon.com)
127:デフォルトの名無しさん
09/04/07 22:43:56
RSpecでBDDやって遊んでるだけでも、17インチ液晶の左右分割では幅が足りないと強く思う
家でだらだらスクリプト書いてるだけだしこれくらいでいいじゃんとこれまでは思ってたけど、ちょうど足りない
少なくとも19が欲しい
大きめフォントをちょっと小さくしたけど、やっぱ足りん
うおー
128:デフォルトの名無しさん
09/04/08 01:22:05
>>116
URLリンク(doc.loveruby.net)
ずっと503
URLリンク(www.ruby-doc.org)
doxygenの自動生成だからヘッダ読むのとほとんど変わらない
URLリンク(www.nilab.info)
かなり古い、1.6.8
こちらの知る限り現状はこんなところ
loveruby.netが直れば一番いいんだろうけどずいぶん前から503のままなので期待薄
129:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/08 08:37:27
△ ブロックの返り値で要素を置き換える
○ ブロック内で最後に評価された値が要素と置き換わる
ブロックつきmapの「ブロックの返り値」は変換後の配列だ
ブロックで最後に評価された値のことをブロックの返り値と呼んではいけない
133:デフォルトの名無しさん
09/04/08 08:53:51
× if 文
○ if 式
公式でも if 文って書いてしまってるけどな
既存言語の影響は強い
134:デフォルトの名無しさん
09/04/08 09:30:31
Rubyでは文も式なだけであって、文を文と呼ぶのが誤りなわけではない。
135:デフォルトの名無しさん
09/04/08 09:59:47
最新のparse.yを見る限り、
symt→expr→arg→primary→if という流れになってるので、
ifは式です。
136:119
09/04/08 10:30:51
>>125
ありがと。
「CSS着せ替えテンプレートプロジェクト」の存在も知ることができて感謝。
137:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/08 11:10:14
>>133-135
Rubyでの文は「カッコなしのメソッド呼び出しの引数よりも優先順位が低い式」のこと。
139:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/08 11:25:04
>>139
ごめん。コピペミス・・・
> Ruby win32 + コマンドプロンプト + cygwin bash: OK
Ruby win32 + コマンドプロンプト + cygwin bash: x
ていうか、調べてたら cygwin から nativeアプリに(non-cygwin app) Ctrl+Cは鬼門みたいですね…。
141:デフォルトの名無しさん
09/04/08 14:04:44
>>133
○if文
◎if式
こうでしょ?
例えば関数呼び出しは式であり文でもあり。
142:デフォルトの名無しさん
09/04/08 14:07:16
とりあえず一つだけ。
初心者スレに過度の原理主義はあんまりよくない。
やりたいなら、本スレにコピペでも持って行って存分にやればいいと思うんだ。
143:デフォルトの名無しさん
09/04/08 14:19:15
すまんかった。正直ifの扱いはどうでもいいんだけど
「文は返値を持たないものだけを指す」と言わんばかりなのが気になって。
初心者スレだけになおさらね。
144:デフォルトの名無しさん
09/04/08 14:20:23
文が値を返すのって感覚的にも不自然だと思う
if は if 式と意図的に呼ぶべき
初心者スレならなおさら、初期の用語の統一は非常に重要
URLリンク(www.google.com)
URLリンク(www.google.com)
うおー負けてるー
145:デフォルトの名無しさん
09/04/08 14:20:39
式の一部になれないのが文だっけ?
146:デフォルトの名無しさん
09/04/08 14:22:08
ifが式ってのが、Rubyの特徴のひとつだもんな。
147:デフォルトの名無しさん
09/04/08 14:27:06
「if 式」のほうが実態をよく表してるし勘違いの元にもならないし興味の取っ掛かりにもなる
つい口に出るもんなので仕方ないが、なるべく式と言うべきだと思った
ちなみに、 for なんかは式だったかどうかをよく覚えてないので
「制御構造 for」とかいう表現で逃げたりする
大人は汚いね!
148:デフォルトの名無しさん
09/04/08 14:30:52
>>145
あっちにレスした
スレリンク(tech板:50番)
149:デフォルトの名無しさん
09/04/08 14:31:38
>>145
スレリンク(tech板:50番)
> ( ) で囲めばなんでも式の一部 (primary) になる。
150:149
09/04/08 14:31:58
>>148
ごめん_| ̄|○
151:デフォルトの名無しさん
09/04/08 14:40:39
Cなどの既存言語の経験者が戸惑わないようにif文って呼んでるのに
その辺の事情を無視してif式って呼ぼうってのは、悪しき原理主義だよなあ
そういやこの前「関数って言うな」なんてのもあった
あれも根っこは一緒か
152:デフォルトの名無しさん
09/04/08 14:41:59
>>151
既存言語の経験者が同じだと勘違いするほうが問題とか、
少しも思わない?
153:デフォルトの名無しさん
09/04/08 14:44:53
初心者が引かない程度に抑えるのが肝要ってことでどうだろうか
スレの使い分け大事
154:デフォルトの名無しさん
09/04/08 14:55:49
>>151
なんで違うものをわざわざ同じ名前で呼んで混乱させようと思うわけ?
155:129
09/04/08 15:14:57
>>130-131
thx!
156:デフォルトの名無しさん
09/04/08 15:38:31
マニュアルの最初の説明でそう書いてある場合は、Rubyでは
無理せずに
そう呼べばいいじゃんね
無理して別の名前で呼ぶ理由もなかんべ
157:デフォルトの名無しさん
09/04/08 15:48:45
>>117で話が出たので自分用スクリプトでちょっとやってみた
小さなメソッドひとつにつき正常と境界と例外で8つくらいずつテスト項目作る羽目になって非常にめんどくさい
別なとこ改造してもspecのテストさえ通ればとりあえず他への影響を忘れて次のことをしていいというのは気楽
158:デフォルトの名無しさん
09/04/08 16:45:49
a.map!{|s| s.sub(/var/, 'foo')} をもっと短く書く方法ってありますか?
なくてもいいのですが、なんか ruby ならありそうな気がして。
159:デフォルトの名無しさん
09/04/08 17:01:14
>>158
特にない
あと String#sub 系列はできれば sub(/var/){'foo'} と書いてくれ
これは Ruby の構造的欠陥だが
160:デフォルトの名無しさん
09/04/08 17:03:10
何十万回も置換を行うような場合は sub のブロック生成コストが気になるお年頃
161:デフォルトの名無しさん
09/04/08 17:04:58
{'foo'}あるいは{"foo#{1}bar"}程度のような単純なブロックは最適化してほしいもんだ
162:デフォルトの名無しさん
09/04/08 17:11:09
>>159
その構造的欠陥について詳細キボンヌ
163:デフォルトの名無しさん
09/04/08 17:51:27
後方参照するときに$1か\1か迷ったり
\をいくつ重ねればいいのか非常にわかりにくいという問題はある。
後方参照しないときまでブロックで書く理由は知らない。
転ばぬ先の杖じゃないかと思うけど、それなら理由書いたほうが。
164:デフォルトの名無しさん
09/04/08 18:01:30
単に構造的欠陥と言ってみたかっただけです。
165:デフォルトの名無しさん
09/04/08 18:09:02
ユーザーは何も悪くない以上、構造上の欠陥ではあるような気はする
166:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/08 18:57:00
> これをかっちょよく書く方法教えておくれよ
高いスーツを買って、ポルシェで高級ホテルに乗り付け、
最上階のレストランでノートPCを開いて書く。
168:デフォルトの名無しさん
09/04/08 18:59:25
何という昭和w
169:デフォルトの名無しさん
09/04/08 19:02:56
> これをかっちょよく書く方法教えておくれよ
走ってくるトラックの前に飛び出して、
僕は死にません!Rubyが好きだから!僕は死にません!
で、泣き止んで家に帰ってから書く。
170:デフォルトの名無しさん
09/04/08 19:05:35
何という昭和からの平成w
っていうか平均年齢おかしいだろこのスレ
171:デフォルトの名無しさん
09/04/08 19:12:38
いま従事している ruby のプロジェクトで、
ソースファイルの改行コードがばらばらになっていることに気づきました。
開発は Windows、本番環境はLinuxです。
Linux の LF に合わせようと思いますが、質問です。
Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
たとえば、Windows 上で、改行コードが LF のソースを動かす、など。
もし問題ないのならば、そのままにしてしまおうかなとも考えています
(sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
172:デフォルトの名無しさん
09/04/08 19:20:16
なんか精神的に嫌だな。
173:デフォルトの名無しさん
09/04/08 19:31:29
>>123
RSpecの書籍がでるらしい。今はpdf版が無料で読めるみたいだ。
RSpec 本 1 章のメモ - たかみやの日記
URLリンク(d.hatena.ne.jp)
174:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/08 21:00:39
>>174
Ruby1.9.1 をアンインストールして Ruby 1.8.7 を使え
177:デフォルトの名無しさん
09/04/08 21:00:44
>>174
URLリンク(jp.rubyist.net)
マジックコメントを書きましょう
178:デフォルトの名無しさん
09/04/08 21:11:56
サポートしてくれるものが無い場合は>>176が正解
1.9.1を解説してくれる何かを頼りに学習してる場合はここで躓く可能性はないわけで、
つまりは1.9.1を教えてくれる教科書に該当するものを持ってないってことで
そういう場合は無理せずに1.8.7を使ってRubyに慣れるのが吉
一生のうちに1種類の言語しか学習できない呪いがかかってるとかそういう場合は別途相談
179:174
09/04/08 21:14:45
レスありがとうございます
>>176
できれば最新版を使いたいのですが、1.8系は1.9系より日本語の使用が楽なのでしょうか?
>177
マジックコメントを記述した結果
puts "あ"
は実行できました!
しかし、残念なたら表示は文字化けしたままです
また、日本語を含むファイルの文字化けも直りません
表示するときに、文字コードを指定するような方法はないのでしょうか?
よろしくお願いいたします
180:デフォルトの名無しさん
09/04/08 21:21:43
最新版だって判断できるくらいRubyに習熟してるなら自力でやれ
181:デフォルトの名無しさん
09/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)
182:181
09/04/08 21:29:30
結果は同じだけど、(1)のほうも
puts line.encode(Encoding.default_external)
のほうがいいかな
183:デフォルトの名無しさん
09/04/08 21:33:02
>>181
初心者に後者勧めるとかマジキチ
184:デフォルトの名無しさん
09/04/08 21:40:31
初心者向け書籍は1.9.2になるまで出ないんじゃないかと最近は思う
185:174
09/04/08 21:59:21
レスありがとうございます
おかげさまで、無事できました
def my_puts str
puts str.encode(Encoding.default_external)
end
なる関数を作成し、putsの代わりに使用しています
これから、日本語を含んだ正規表現の利用を試します
また何かありましたら、よろしくお願いいたします
186:デフォルトの名無しさん
09/04/08 22:03:12
Windows版のコンソール(cmd.exe?)への出力を諦めれば、相当楽になるような気がする。
例えばファイルにそのまま出すとか。
敢えて茨の道を進む>>185(>>174)に祝福あれ。
187:デフォルトの名無しさん
09/04/08 22:06:30
1.8.7なら倍のスピードで学習できるけどな
悲惨だ
188:デフォルトの名無しさん
09/04/08 23:26:28
nkf で変換とかだめなの?
by 初心者
189:デフォルトの名無しさん
09/04/08 23:36:08
nkfじゃutfがだめじゃない?
190:デフォルトの名無しさん
09/04/08 23:36:51
UTFも扱えるけど標準出力に書き出すたびにNKF呼ぶんだぞ
死ぬほど面倒じゃないか
191:デフォルトの名無しさん
09/04/09 00:12:04
>>190
何その Ruby 1.8 以前を全て敵に回した発言
192:デフォルトの名無しさん
09/04/09 00:42:28
以前と未満を間違えるとプログラムは動かないぞ
193:デフォルトの名無しさん
09/04/09 01:34:11
<バージョン>Ruby 1.8</バージョン> <時間>以前</時間>
<バージョン>Ruby 1.8</バージョン> <バージョン>未満</バージョン>
194:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 08:41:13
URLリンク(www.ruby-lang.org)
197:デフォルトの名無しさん
09/04/09 08:44:38
p するからだ
do~end ブロックを関数的メソッドに渡したい場合は引数全体を ( ) で括れ
理由は省くが、空白の有無でパースがコケている
198:デフォルトの名無しさん
09/04/09 09:28:12
do~endと{}では結合度が違う
do ~ end → おおもとのメソッドに結びつく
{ ~ } → 直前のメソッドに結びつく
no1ではブロックがpに結びついてるからだろう
199:デフォルトの名無しさん
09/04/09 10:27:52
つまり、最初のは
p(a.inject(0)) {|sum, x| sum += x }
と見なされとるわけよ
200:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 11:57:14
>>194
いやーそれが、win32のプログラムをcygwin上で動かすと不具合あったりしますよね…。
Ctrl+C押すとcygwinアプリには届くけど、ネイティブアプリには届かずに落ちちゃったり。
(Railsスレにも書きましたけど)
まあ結局は、仮想環境か専用サーバーかのLinuxにターミナルでつなぐか、
coLinux、andLinuxでも入れろやってことになりそうですけども
202:デフォルトの名無しさん
09/04/09 12:08:53
ひとつ質問いいですか?
kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
けっこう特に後者に(俺が)未だにハマるんですよ。
MLのログみると、trap:kconvにあるような半分バグ的仕様だけど、変更点としては大きいからそのまま、
みたいな感じですが。
kconvで-m0とか-Xはずすような、
モンキーパッチみたいなのってないんでしょうか?
203:デフォルトの名無しさん
09/04/09 12:21:07
いまだにkconv使ってるやつのほうが博物館行きだからじゃないかな
204:デフォルトの名無しさん
09/04/09 12:32:04
> kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
x nkf の -m0(MIMEデコード)
o nkf の -m(MIMEデコード)
>>203
ええええ('A`)
なら、String.toutf8 みたいなユウワクに駆られるようなメソッド用意しとくんじゃねーよヽ(`Д´)ノ ウワァァン!!
205:デフォルトの名無しさん
09/04/09 14:24:57
>>200
レスどうもありがとうございます。参考になりました。
改行コードが混在したソースの状態でも、とりあえず問題なく動くということで安心しました。
shebangの問題は大丈夫です。
今回はRails + Rubyによるバッチで、Linux上で shebang で起動される
ソースは、ただしく LF になっていました。
206:デフォルトの名無しさん
09/04/09 15:15:05
すごい初歩的な質問です。
URLリンク(www.ruby-lang.org) を読むと、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:デフォルトの名無しさん
09/04/09 15:17:53
if h['a'] && h['a']['b'].nil?
p "ok"
else
p "ng"
end
208:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 15:31:50
しかし誰も配列の話はしていなかった
210:デフォルトの名無しさん
09/04/09 15:36:17
>>209
現象は一緒じゃん
要はメソッドチェーンが切れてるだけだし、メソッドチェーンのレシーバがnilになりうるときと対処が全く同じ
n次元配列のクラスを標準で添付しなかったのは悪意だと思う
211:206
09/04/09 15:53:32
>>207-210
ちょっと衝撃的な事実。大変勉強になりました。
多次元がなく、判定が if h['a'] && h['a']['b'].nil? と煩雑としたら、
多次元を扱わない別の方法でデータを扱っているんですか?
212:デフォルトの名無しさん
09/04/09 15:54:00
けっこういろんな人が困ってるな、2次元構造のコレクションの nil 問題
「データに nil があるとエラーになります」とか苦しい説明をしてる人も…
213:デフォルトの名無しさん
09/04/09 15:57:02
デフォルトでおすすめできる多次元配列のライブラリもないしな。
214:デフォルトの名無しさん
09/04/09 16:04:49
>>211
概念的にも構造的にも多次元ではないので「配列のネスト」「ネストしたハッシュ」などとお呼びくださいまし
で、Ruby ではいわゆる番地でコレクション(配列、ハッシュ)にアクセスすることはそう多くない
コレクションの each メソッドを使って枚挙するか、そういうアクセスを基本としてデータ構造を考える
んが、配列のインデックスやハッシュのキー決め打ちでネスト先にアクセスすることも多くて、
「あ、そうか、最初のが nil になればこれってエラーか、めんどくさいなあ」と言って
h[key1][key2] が h[key1] && h[key1][key2] になるのは日常茶飯事
だから、もし、本当に、番地による多次元アクセスが大量でメインな仕事をするつもりなのなら、Ruby は使わないほうがよい
215:デフォルトの名無しさん
09/04/09 16:05:46
ここでサクッと2次元配列みたいに扱うハックがキボン
216:211
09/04/09 16:09:40
>>214
ひやー。パラダイムシフトが求められるのですね。
ありがとうございます。
217:211
09/04/09 16:15:20
僕もハッカー待ちます><
218:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 16:32:28
h = {}
h['a']['b'] = "hello"
をする定石はなんでしょうか?
220:デフォルトの名無しさん
09/04/09 16:37:57
誰でもわかる勘違いのない方法
h = {'a' => Hash.new}
h['a']['b'] = "Hello"
「ハッシュにあるキーでアクセスしてキーが存在しなかった場合、特定のオブジェクトを代わりに作ってそのキーに対する値とする」
という動作をさせることもできるが、読むのめんどい
どっかで書いたので誰かが書くと思う
221:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 16:45:34
>>220
早速ありがとうございます。その「ハッ(略」にも興味があります。
それは
h = {'c'=>"aa"}
h['a']['b'] = 'hello'
の場合、h['c'] を消さない方法でしょうか?
224:218
09/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]
225:223
09/04/09 16:47:52
>>220-222
ありがとうございます!
>>221 の方法で >>223 は実現できたので取り下げます。
うーん。確かにどれも直感的な方法ではないので、別のデータ構造を考えます。
226:デフォルトの名無しさん
09/04/09 16:48:29
ハッシュを構造体の代わりとして用いることは
是か否か、について教えてくさい。
227:デフォルトの名無しさん
09/04/09 16:50:52
メンバが有限ならStruct、そうでないならHashという私見です。
228:デフォルトの名無しさん
09/04/09 16:55:00
とりあえず否
構造体用のクラスがRubyには用意されているため。
これが満足できない回答なら、情報小出しにすんなといいたい
229:デフォルトの名無しさん
09/04/09 16:56:30
>>226
/)
///)
/,.=゙''"/
/ i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
他の言語の構造体に完全に該当するクラスはRubyにはない
>>227のように Struct が標準でついてくるが、
ぶっちゃけ「つけた名前のメソッドでもアクセスできるなにやら便利な配列」以上の使われ方はしないので好きにしれ
Struct を使って怒る人は特にいない
230:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/04/09 16:59:09
[ 0, 0, [] ]
こういうのがあってイラっとした。
しかもコメントがない。死ね。
232:デフォルトの名無しさん
09/04/09 17:02:15
haの返り値は最後に評価された式つまりその代入式の値。
代入式の値は右辺の値。
早とちり乙。hはちゃんと変わってるはず。
233:デフォルトの名無しさん
09/04/09 17:03:33
>>230
よくわからないものを無理して使うからよ
234:デフォルトの名無しさん
09/04/09 17:05:48
>>233
自分で泥臭くでも作れば間違いないのにね
借り物を使うから、どう動作してるのかがわからなくなる…
235:デフォルトの名無しさん
09/04/09 17:07:42
イディオムを教えるっていうのは、それを分解して
どういう動作なのか調べて自分の肉として取り込んでもらうってことだと思ってた。
236:230
09/04/09 17:08:49
>>232-233
ほ、本当だー。ありがとうございます。
Perl/PHP と比べると不思議ですが、面白いですねー。
>>221-222, 224 などなど理解できてないので精進しますです。
237:デフォルトの名無しさん
09/04/09 18:45:05
>>202
お前は俺か、ってくらい、昨日同じことで悩んでた。
>>203
今は何使うのが常識なのか教えてー。 1.8.x で。
238:デフォルトの名無しさん
09/04/09 18:53:58
常にh['a']['b']などと二段階でしかアクセスしないなら、そもそもHashをネストさせる意味はない。
h[['a', 'b']] = "Hello"
とでもしとけ。
239:デフォルトの名無しさん
09/04/09 18:58:03
うわぁ・・・
240:デフォルトの名無しさん
09/04/09 19:10:01
ベンゾウさんの中・・・
241:デフォルトの名無しさん
09/04/09 19:21:44
>>238
rails の select ヘルパーが <select name="a[b]"> という名前になるんです。
なので params['a']['b'] が空の場合とかの処理に必要で。
rails はどうなっているんだろうなぁ。
242:デフォルトの名無しさん
09/04/09 19:47:30
param["a"]["b"]にアクセスするときって
["a"]が無い時点で処理続行不可能なパターンが大抵だから
returnなりraiseなりでさっさと脱出してるな。railsはしらね。
return unless param["a"]
if param["a"]["b"]
243:デフォルトの名無しさん
09/04/09 19:47:57
そもそも、別にkconvやNKFが時代遅れなんて事はないと思うが
今でも主流って位には使われてるはず
244:デフォルトの名無しさん
09/04/09 19:50:00
>>207の方式が一番素直だな。
245:デフォルトの名無しさん
09/04/09 23:16:04
params['a']['b'] rescue nil
246:デフォルトの名無しさん
09/04/10 12:36:18
eval ってなんて読むの?
247:デフォルトの名無しさん
09/04/10 12:41:50
>>246
イバル
evaluate のことなのだから、イバル
日本では evaluate を踏まえてもなお「えばる」と読まれてる気がするので
もうエバルでいいよという気がするが、本来はイバルと読むべき
ちなみにイーバルは「俺の昼飯シャキヴェントゥー」並に間違ってカッコわるい表現なので避ける
248:デフォルトの名無しさん
09/04/10 13:24:21
_,,-ー----.、
<" "l
'; ,、、__ソ^`7, i、
';'___ _,,, リ
トーj 'ーー r
ヽノL ヽ ノ < シャキヴェントゥー
ヽ∀ /
ー'
249:202
09/04/10 13:27:30
kconv直したのを作ろうと思うんだけど(gem化しとくと便利かね)
名前何がいい?
250:デフォルトの名無しさん
09/04/10 13:30:36
jconv
251:デフォルトの名無しさん
09/04/10 13:36:48
>>249
kconv2
252:デフォルトの名無しさん
09/04/10 13:42:26
ちょっと質問。
ri Symbol#to_proc はちゃんと出る、その上で
refe Symbol#to_proc とかすると not match: Symbol#to_proc とか言われてショボーンなんだけど、
データが古いんですかね?
あと、このrefeのデータベースを一発で更新するコマンドてないの?
refeはGemsで入れたものです。0.8.0.3の最新版
253:デフォルトの名無しさん
09/04/10 13:48:54
jconv: japanese character converter ?
kconv: kanji character converter ?
kconv2: kanji character converter 2?
2はともかく、japanese とか kanjiとかどうなんん?と思ったけど
そもそも外人は、UTF-8かASCIIかだろうし、使わんかw
254:デフォルトの名無しさん
09/04/10 13:57:35
EUC-JPとJISとShift JISとUTF-8の相互変換に、
Japanese以外のどんな需要があるというのか
255:デフォルトの名無しさん
09/04/10 14:07:07
>>254
一応、 Latin の文字と UTF-8 文字の変換の需要はある
日本人ジャナイヨモードにした場合はSJIS/EUCはLatinだとみなして変換してくれるとか
256:デフォルトの名無しさん
09/04/10 15:15:17
>>252
Gemのrefeはもう手付かず。
なんでかってーと るりま のDB引くコマンドになったから。
257:デフォルトの名無しさん
09/04/10 17:16:59
>>256
kwsk
258:デフォルトの名無しさん
09/04/10 17:26:38
URLリンク(doc.loveruby.net)
259:デフォルトの名無しさん
09/04/10 18:17:15
きばる
260:237
09/04/10 21:10:20
>>243
なるほど。とりあえず安心して使えそうです。
>>249
wktk
261:デフォルトの名無しさん
09/04/10 21:23:19
>>250には、iとkの間って意味もありそうなのは、実装的に無茶振りか
262:デフォルトの名無しさん
09/04/11 01:16:16
2画面になってて
一方がIRB, 他方がグローバル変数の内容一覧みたいなツールってない?
そういう環境で電卓みたいな感じで使いたいんだけど。
263:デフォルトの名無しさん
09/04/11 02:04:10
グローバル変数って内容が長大なもの(gem使用時の$LOAD_PATHとか)が
あるから、常に表示ってのはかえって使いづらくない?
代用として ~/.irbrc にこう書くのはどうか。
def g
puts global_variables.map { |v| %Q|#{v} = #{eval "#{v}"}| }
end
264:デフォルトの名無しさん
09/04/11 03:14:02
>>262
ためしに作ってみた
望みのものかどうかはわからないけど
URLリンク(www2.wbs.ne.jp)
まず、WindowsのActiveScriptRubyが前提です。環境が違ったらごめんなさい
既存のツールにウォッチ式もどきウィンドウをつけたものです
本物のirbではありません
グローバル変数をすべて表示するのはあまりにも見づらいため、
add_watch(変数名)、remove_watch(変数名)で監視する変数名を個別に追加する仕様にしました
すべてのグローバル変数が欲しければ、eval.rbの__getDbgInfo()内をコメントされてる行と
差し替えみてください
265:264
09/04/11 03:27:46
補足
readmeにも説明あるけど、
起動直後は JScript モードで動作します
ruby の入力を受け付けるためには
#cs ruby
としてモードを切り替えてください
266:デフォルトの名無しさん
09/04/11 05:22:31
フリーのレンタルサーバーで
最初からrailsがインストールされている
タイプって、スピードはどうなの?
267:デフォルトの名無しさん
09/04/11 09:38:44
>>266
どんなレンタルサーバーかによるな。
共有鯖はまずありえない。
VPSは小規模はあり、専用鯖ならあり。
(だけど、VPS、専用鯖でrailsがプリインスコって何か変な感じ。
大概、自分でOSまっさらからインスコするもんだろうから)
ただし、どちらにせよCGI駆動はありえない。
見なくちゃいけないところは、「railsプリインスコ」の他にどうやってそのRailsがその鯖で動くかってこと。
・apache + mod_rails(Passenger)
・apache + mod_proxy_balancer + mongrel
・
とかその辺
というか、railsインストールされているっていっても、必要なバージョンは自分で決めないといけないしな。
向こう側で指定されてても困ると言うか。
結局自分で入れるか、freezeして持ち込むハメになる。
詳しくはwebprog板のrailsスレか、レンサバ板で聞いたほうがいいと思う。
268:デフォルトの名無しさん
09/04/11 14:09:02
持ってるデータのなかにある、ある値を修飾して別の値にして返すというメソッドを作ります
データはとりあえずインスタンス変数として存在して、
ある値はたとえば「データがハッシュなのでキー指定して取得」とか「データが自作クラスなのでアクセサで取得」とかです
んで、修飾するメソッドに値を与える方法は、
・ メソッドに引数として明示的に渡す
・ メソッド内部でインスタンス変数を読ませる
のどっちが好ましいもんでしょうか
後者だとテスト作るのめんどくさいんですが
269:デフォルトの名無しさん
09/04/11 14:26:06
>>268
それについては他の言語で結論が出ている
「事前にデータが読める程度にわかっている単純な場合、引数指定以外はおおむね糞であり、
最初は楽でも最終的には引数を取らざるを得なくなるようになるので、素直に最初から引数で実装しとけ」
270:デフォルトの名無しさん
09/04/12 00:34:51
>>268の文章が読みにくいのでリファクタリングしてみた
インスタンス変数(ハッシュや自作クラス等)から値を取得、加工して返すというメソッドを作ります。
この時、値を取得するためのパラメータを渡す方法としてどちらが望ましいと思いますか?
・メソッドの引数として渡す。
def func(key) ; "<h1>#{@data[key]}</h1>" ; end
・別のインスタンス変数にパラメータを代入し、メソッド内部からアクセスする。
def func ; "<h1>#{@data[@key]}</h1>" ; end
271:デフォルトの名無しさん
09/04/12 01:10:10
↓現金1000万円が当たるチャンス!!
URLリンク(d39.decoo.jp)
272:デフォルトの名無しさん
09/04/12 13:58:11
>268
前者。
キーは引数として与えるか、メソッド名から与える(メソッド内で決め打ちとか動的生成とか)かの2択。
>270後者のような実装は、ゴミ。
URLリンク(pastie.org)
273:デフォルトの名無しさん
09/04/12 13:59:11
>>270
常識的にはこう。
def func(value) ; "<h1>#{value}</h1>" ; end
func(@data[key])
274:デフォルトの名無しさん
09/04/12 14:04:05
>>272
> class UpperCaseDecorator
> @map = nil
なんのつもりだ?
275:272
09/04/12 14:22:36
>274
ああ、そうか、Rubyはこれだとインスタンス変数じゃなくてクラスインスタンス変数になるんだったな。
コーヒーの飲みすぎで完璧に寝ぼけてた。
276:デフォルトの名無しさん
09/04/12 14:40:02
コーヒーと寝ぼけるの因果関係がわからん
277:デフォルトの名無しさん
09/04/12 16:13:31
>>276
自分のプライドのためにもRubyをよく知らずに口を出したことをなかったことにしたい、の意
ここでプライドが出てくるあたり致命的というか重症
278:デフォルトの名無しさん
09/04/12 16:16:52
ruby使いは割とプライド高いの多いよ。
信者である事が選民思想と一致するし。
279:デフォルトの名無しさん
09/04/12 16:27:52
Rubyが俺の脳にまったくフィットしない。汚染の概念とか部分的には好感が持てるが。
たぶん俺がPERLアレルギー持ちなのがいけないのかな。
280:デフォルトの名無しさん
09/04/12 16:36:30
単純に、昨晩コーヒー飲んで寝てなかったんじゃね?
281:デフォルトの名無しさん
09/04/12 16:39:42
>>279
そういうのは人それぞれだろうな。
おれはPHPをやってたとき
かなりモチベーションが下がってたなとRubyをやり出してわかった。
282:デフォルトの名無しさん
09/04/12 16:44:25
漏れもRubyやってたのがいつの間にかJavascriptにシフトしかけてた
またRubyに戻るべくリハビリ中
283:デフォルトの名無しさん
09/04/12 16:51:14
他を見下す奴が一番多いのはRubysit。他言語に限らず言語内でもな。
プライドが一番高いのはPerler。Rubyistと違って他にケンカ売ったりはしないが、俺最強と思ってる奴が多い。
PHPを使ってる「プログラマ」は特に言語に拘りのない奴だな。あと、そもそも心根がプログラマじゃない奴。
284:デフォルトの名無しさん
09/04/12 17:03:35
>>283
で、偉そうに印象批判してるお前は何者よ
285:デフォルトの名無しさん
09/04/12 17:05:28
matz
286:デフォルトの名無しさん
09/04/12 17:09:33
ていうかバトロワスレでやれ
スレリンク(tech板)l50
287:デフォルトの名無しさん
09/04/12 17:22:24
>>286
そこはいちおう言語を語るスレだから、
デタラメな理屈と幼稚な精神をフル回転させて
大勢の人間にレッテル貼っちゃう生き物は不要。
288:デフォルトの名無しさん
09/04/12 17:36:09
>>276-280
コーヒー飲みすぎると、カフィイン中毒になるからそれじゃない?
1日10杯以上飲む人は頭痛とかうつとかに気をつけたほうがいい。詳しくはwikipediaいけ
289:デフォルトの名無しさん
09/04/12 18:26:20
俺はもっぱら日本茶だ
290:デフォルトの名無しさん
09/04/12 18:26:40
>>287
隔離スレの分際で存在意義に文句言うな
291:デフォルトの名無しさん
09/04/12 18:27:19
リプトンのティーパック100個入り300円ぐらいの
あれで紅茶中毒になりますた
292:デフォルトの名無しさん
09/04/12 18:59:37
>>290
隔離しているものの種類が違う。
293:デフォルトの名無しさん
09/04/12 19:32:34
100個入り300円ってどこで買ったんだよ
294:デフォルトの名無しさん
09/04/12 19:42:11
ここで Java 厨のおれが登場
(C、VB、PHP、Perl はいちおう書ける)
オライリーの「初めてのRuby」を読み終わったところだが、
Ruby おもしろい
Python より頭に入りやすい
295:デフォルトの名無しさん
09/04/12 19:48:43
>>290
いや、あれ掃きだめだろ
なんでも入れちゃっていいんじゃないかな
ということにして
>>294
Rubyが本題じゃなけりゃ言語比較ネタは>>286でどぞ
296:デフォルトの名無しさん
09/04/12 19:51:45
>>293
わたくし嘘をついておりました
100バッグで600円ちょいだね
リプトン ブリスク ティーバッグ
URLリンク(www.askul.co.jp)
297:デフォルトの名無しさん
09/04/12 20:08:40
インスタンスメソッドとクラスメソッドの使い分けがわからなくなった
クラスのオブジェクト関係なく、引数を受け取って適当に加工して返すメソッドはクラスメソッドでいいかな
でもそうするといわゆる「メソッドから処理を切り出したメソッド」は一律でクラスメソッドであるほうがいいよね
298:デフォルトの名無しさん
09/04/12 20:13:35
そのクラスのインスタンスを生成しなくても実行できるメソッドがクラスメソッド。
インスタンスごとに振る舞いが異なる必要がない場合、クラスメソッドにする場合が多いかな。
299:デフォルトの名無しさん
09/04/12 20:15:52
>>268の考えを推し進めるとそうなりがちだ
Rubyのクラスは他の言語のクラスと違って「処理のなんとなくのカタマリ」である場合が少なくないからな
モジュールで十分なのにクラスにしてしまう例が散見されるというかあんま深く考えてねえ
引数でのやり取りだけで十分で、クラスのインスタンスの役目が薄い場合は困りもん
300:デフォルトの名無しさん
09/04/12 20:20:33
as-a関係をmixinを使わずに実現するときとか。hasじゃなくてasね。
301:デフォルトの名無しさん
09/04/12 20:26:33
こんな話? puts Html.new(:title => 'タイトル', :body => '本文だよ!').html で使う
class Html
def initialize(param)
@title, @body = [param[:title], param[:body]]
end
def title; "<title>#{@title}</title>"; end
def body; "<h1>#{@title}</h1>\n<p>#{@body}</p>"; end
def html
return <<EOF
<html>
<head>#{title}</head>
<body>#{body}</body>
</html>
EOF
end
end
class Html
def initialize(param)
@title, @body = [param[:title], param[:body]]
end
def html
return <<EOF
<html>
<head>#{Html.title(@title)}</head>
<body>#{Html.body(@title, @body)}</body>
</html>
EOF
end
def self.title(str); "<title>#{str}</title>"; end
def self.body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end
end
302:デフォルトの名無しさん
09/04/12 20:36:02
class Html
def initialize(param)
@title, @body = [param[:title], param[:body]]
end
def title(str); "<title>#{str}</title>"; end
def body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end
def html
return <<EOF
<html>
<head>#{title(@title)}</head>
<body>#{body(@title, @body)}</body>
</html>
EOF
end
end
一番普通一般無難だと思われるコレが出ないのはなんでなんだぜ
いや、まあ、インスタンスに全く依存しないからインスタンスメソッドである強い必然性はないというのは正しいが
インスタンスメソッドから呼ばれるだけの、インスタンスメソッドから処理を括り出しただけのメソッドは、
あんまり深く考えずにインスタンスメソッドで作ってしまってもいいと思うなあ
クラスメソッドは
「インスタンス内部で使ってるけど、あんまりにも便利だから外部にも単体で公開しちゃうよ!」
という意図があるべきだと、漠然と思ってる
303:デフォルトの名無しさん
09/04/12 20:43:13
?
304:デフォルトの名無しさん
09/04/12 20:53:37
>>302
URI.escape とか?
クラスに属するユーティリティとしてのクラスメソッドは立ち位置が曖昧過ぎ
parse みたいにインスタンスを返すクラスメソッド以外は Util モジュールとかに吐き出すのが素直
305:デフォルトの名無しさん
09/04/12 20:54:43
>>296
やすっ!
紅茶も飲みすぎたらカフェイン中毒になるから気をつけてなw
ウーロン茶とかも注意
306:デフォルトの名無しさん
09/04/13 00:27:28
CPU使用率とメモリの使用率を取得できますか?
ゲームの簡易的なベンチマークを作ろうとしているのですが…
307:デフォルトの名無しさん
09/04/13 00:30:04
>>306
Rubyとしては特にできません
OSに直接聞いてください
308:デフォルトの名無しさん
09/04/13 00:37:01
Ruby 本体では無理だな
rubygem の sys-cpu とか使えないかね
あれは使用率とか検知しないんだっけ?
309:デフォルトの名無しさん
09/04/13 11:38:09
配列 arr に入った文字列を元にメソッドを呼び出したいのですが、
下記では `method': wrong number of arguments (0 for 1) になります。
どのように書けばいいのでしょうか。
class C
def self.m1
"1"
end
def self.m2
"2"
end
def self.m3
"3"
end
end
arr = %w[m1 m2 m3]
arr.each{|method| p C.method} #=> 1, 2, 3 と出ることを期待
310:デフォルトの名無しさん
09/04/13 12:07:13
C.__send__ method
311:デフォルトの名無しさん
09/04/13 12:10:14
>C.method
これは
C.send :method
と同じ。といえばもう原因も解決方法もわかるよね?
312:デフォルトの名無しさん
09/04/13 12:11:06
なんでどいつもこいつもレシーバつきメソッドの引数にカッコつけないんだよ
313:デフォルトの名無しさん
09/04/13 12:15:46
>>310
あれ、自分のスクリプトでも__send__使った方がいいの?
>>312
省略できるから。できないときはしない。
314:デフォルトの名無しさん
09/04/13 12:35:27
>>313の2行のレスの関係性がなかなか味わい深い
315:デフォルトの名無しさん
09/04/13 12:37:26
Object#__send__ ではなく Object#send を使う人間がメソッドのカッコを極力省略するのはポリシーが一貫してる
と思う
316:デフォルトの名無しさん
09/04/13 12:45:01
>>313
send でなければならない強い理由がないのなら、日常的に __send__ を使う
他の誰かや未来の自分が send メソッドを C に定義しないとも限らないし
実質上 send が死にメソッドになるのが厄介といえば厄介
メール関連のライブラリくらいでしか再定義された send は見たことないけどな
317:デフォルトの名無しさん
09/04/13 13:03:10
括弧をつけるかつけないかの判断ってどんなのがいいんだろうな
候補
1.括弧必須以外は括弧をつけない
2.すべて括弧をつける
3.基本すべて括弧をつける。
ただし「p」など組み込まれたレシーバーを省略するメソッドは括弧をつけない。
当然、自分が書いたプライベートメソッドなどは省略しない。
4.仮引数は括弧を省略
5.仮引数は括弧をつける
6.IFなどはすべて括弧を省略できる場合、省略
7.IFなどはすべて括弧をつける
まだまだありそうだが。基本の基準を括弧つきかそうでないか、どちらにするかだな。
括弧をつけた方が思わぬ動作に遭遇する確率を低くできるのだが、
「p」とかにはつけたくない。
チームでやるときは、ごちゃごちゃになるからできるだけ標準化したい。うむむむ。
318:309
09/04/13 13:21:15
__send__ でできました。ありがとうございます。
319:デフォルトの名無しさん
09/04/13 13:25:27
>>316
$stdoutとSTDOUTの関係みたいな、sendに機能を加えたり
差し替えたりするための冗長性だと思ってた。
「再定義」がまったく別のメソッドにするという意味しかないなら
存在意義ないよなあw
>>317
規約が必要な状況だと3・5・6の前田流が無難。
URLリンク(shugo.net)
意図した返値ならreturnを省かないとか地味に大事。
論理演算子は少し腑に落ちないけど、優先順位でトラブりやすいんだろうな。
320:デフォルトの名無しさん
09/04/13 14:18:02
>>319
前田って人はこの人か?
URLリンク(jp.rubyist.net)
知らんかった。サンクス、参考にするわ。
321:デフォルトの名無しさん
09/04/13 15:06:39
__send__: とにかく絶対にリフレクションでメソッドを呼びたい
send: 基本的にただメソッドを呼ぶだけのつもりだけど、中でどうするかはレシーバに決めて欲しい
とかかな。
pとかrequireとかにカッコはつけたくない。
けどs2 = s1.sub(/hoge/, '') とかにはつけたい。
ってことで右辺値かどうかが一番でっかいと思う>カッコの省略
322:デフォルトの名無しさん
09/04/13 15:18:33
えーと…、
__hoge__
とアンダースコア前後2個つきで書く意図自体は他の言語でも有名だし理解してもらえてるよね?
既存の hoge 、またはユーザー定義の hoge と被らないように「普通ありえない名前」にする、という意図
323:デフォルトの名無しさん
09/04/13 15:33:15
>>322
他人に理解してるか聞く前に、自分がスレの流れを理解できるてるか自分の心に聞け
324:デフォルトの名無しさん
09/04/13 16:23:31
gem でインストールした各種ライブラリのソース、ドキュメント(Rdoc?) は、ローカルPCのどこに格納されるのでしょうか?
たとえば Rails の rescue.rb というソースを見たい場合、
URLリンク(api.rubyonrails.org) の左のペインから ActionController::Resuce をクリックして
URLリンク(api.rubyonrails.org)
を見ると、HTML の上に In: vendor/rails/actionpack/lib/action_controller/rescue.rb と
表示されますが、これがどこかわからない。
自分は Ruby を c:\ruby\ruby-1.8.5-i386-mswin32 にインストールしていて、
以下のように rails をインストールした。
gem install rails -v 2.1.1 --include-dependencies
んで、c:\ruby\ruby-1.8.5-i386-mswin32 の下で、"rescue.rb" を検索したら、
c:/ruby/ruby-1.8.5-i386-mswin32/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib/action_controller/rescue.rb
が見つかったのですが、これがソースの実体ですか?
In: vendor/rails を、ローカルのどのように読み替えたらいいのかわからないです。
325:デフォルトの名無しさん
09/04/13 16:36:07
gem environment gemdir で出てくるディレクトリが vendor で、 その下の固定 gems ディレクトリが rails ディレクトリだな
rubygem ライブラリのソースを参照することが多くなると思うが、全ては gemdir 以下に入ってる
326:デフォルトの名無しさん
09/04/13 16:38:12
>>323
__send__ は send が被らないように作ったメソッド名だ、という指摘のどこが変?
__ つきメソッドが何か特別扱いの動作をする予約名メソッドだという勘違いは初心者によくあるぞ?
327:デフォルトの名無しさん
09/04/13 16:57:21
そんな指摘してねーだろカス
328:デフォルトの名無しさん
09/04/13 16:57:38
結局 >>322 はひとりごとってこと?
内容の是非は別にして
329:デフォルトの名無しさん
09/04/13 17:06:15
>>326
指摘の内容が変とかそれ以前の話で、
お前は誰に指摘したんだ?ってことでしょ。
330:デフォルトの名無しさん
09/04/13 19:25:15
配列の最初の要素だけ別処理をしたいです
どう書くのが普通?
331:デフォルトの名無しさん
09/04/13 19:30:48
>>330
result << first_only(arr[0])
arr[1,-1].each do |e|
result << usual_process(e)
end
こんな感じが普通だと思う
「あー最初の要素だけ別扱いしたいんだなー」と読み下せる
332:デフォルトの名無しさん
09/04/13 19:55:34
f = File.open(ファイル)
# いろいろする!
f.close
closeメソッドを呼んだ時点で、データはフラッシュされていると考えてよいのでしょうか?
それとも明示的にflushメソッドを呼ばないとダメですか?
333:デフォルトの名無しさん
09/04/13 19:58:20
普通かどうかは知らないけど(dupしてから)shiftで最初の要素と残りの配列に分けてる。
334:デフォルトの名無しさん
09/04/13 20:00:09
>>332
IO#close は IO#flush を呼ぶ
IO.open のブロックは終了時に IO#close を呼ぶ
ということで、たとえば書き込んだファイルを別名でコピーしたいような場合は、
close またはブロック終了後にcp を行うべき
Ruby では close メソッドを使うことはあまりないので、ブロックを使う記法に慣れてくれ
335:デフォルトの名無しさん
09/04/13 20:02:04
arr[1,-1]
これ、おれはあんまり受け付けないなあ
each_with_index使って、
indexが0のときは別処理みたいな方が自然な気がするが
336:デフォルトの名無しさん
09/04/13 20:02:09
>>334
わかりました。ありがとうございます。
337:デフォルトの名無しさん
09/04/13 20:10:34
配列がアホみたいに大きい場合、
res << first(a[0])
a[1..-1].each do |e|
res << rest(e)
end
は配列のほぼ丸ごと複製が行われるのであんまりよろしくない
a.each_with_index do |e, i|
res << i.zero? first(e) : rest(e)
end
が無難な動作だが、1要素目から最後まで比較する余地なく偽が続くのが若干キモい
res << first(a[0])
1.upto(a.size+1).each do |n|
res << rest(a[n])
end
というのを思いついて、これは配列 1個で比較も 0回でおそらく高速だが、偏狭的だなと思う
338:デフォルトの名無しさん
09/04/13 20:17:55
apt で ruby を入れたら /usr/bin/ruby や /usr/lib/ruby 以下に
入ったのだが、事情により
ln -s /usr/bin/ruby /usr/local/bin/ruby
して使っていたところ、 gem で入れたものが /usr/local の方に入ってしまって
地味に驚いたことがある。
339:デフォルトの名無しさん
09/04/13 20:24:42
def each_specialize_first(collection, at_first)
iter = collection.each
at_first.call(iter.next)
loop{ yield(iter.next) }
end
each_specialize_first a, lambda{|e| ... } do |e|
...
end
とか。
340:デフォルトの名無しさん
09/04/13 20:29:59
普通はどうするもんか、という質問にメソッド定義しちゃう人って何なの
341:デフォルトの名無しさん
09/04/13 20:30:34
top = a.shift
a.each {|x| }
a.unshift top
今はコレが好み。整数を手繰ってどうのこうの、
毎回ゼロか調べてどうのこうのはお腹一杯。
shiftとunshiftってい対応がすき。
342:デフォルトの名無しさん
09/04/13 20:31:34
>>340
熱狂した痛い初心者
つまり、過去の自分
343:デフォルトの名無しさん
09/04/13 20:33:41
>>341
キューって知ってる?
344:デフォルトの名無しさん
09/04/13 20:36:18
一度shiftしたものは最後までshiftするべきだと思う
shiftした時点でそれは配列ではなくqueueなんじゃないかと
345:デフォルトの名無しさん
09/04/13 20:37:17
>>343
オハヨ
346:デフォルトの名無しさん
09/04/13 20:47:09
前にもこんな話あったな。queueだと言い張りたいならQueueクラス作れよw
347:デフォルトの名無しさん
09/04/13 20:52:37
配列の要素をshiftしてunshiftするってのは筋が悪いの?
348:デフォルトの名無しさん
09/04/13 20:58:04
>>346
arr[0] と arr[1..-1] で用が済むというか全く同じ動作のはずなのに、
わざわざ shift という名前のメソッドを使うのなら、その配列はキューであるという意図があるはずだろ