1 名前:1様 [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つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
159 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:01:14 ] >>158 特にない あと String#sub 系列はできれば sub(/var/){'foo'} と書いてくれ これは Ruby の構造的欠陥だが
160 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:03:10 ] 何十万回も置換を行うような場合は sub のブロック生成コストが気になるお年頃
161 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:04:58 ] {'foo'}あるいは{"foo#{1}bar"}程度のような単純なブロックは最適化してほしいもんだ
162 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:11:09 ] >>159 その構造的欠陥について詳細キボンヌ
163 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:51:27 ] 後方参照するときに$1か\1か迷ったり \をいくつ重ねればいいのか非常にわかりにくいという問題はある。 後方参照しないときまでブロックで書く理由は知らない。 転ばぬ先の杖じゃないかと思うけど、それなら理由書いたほうが。
164 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:01:30 ] 単に構造的欠陥と言ってみたかっただけです。
165 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:09:02 ] ユーザーは何も悪くない以上、構造上の欠陥ではあるような気はする
166 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:57:00 ] > これをかっちょよく書く方法教えておくれよ 高いスーツを買って、ポルシェで高級ホテルに乗り付け、 最上階のレストランでノートPCを開いて書く。
168 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:59:25 ] 何という昭和w
169 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:02:56 ] > これをかっちょよく書く方法教えておくれよ 走ってくるトラックの前に飛び出して、 僕は死にません!Rubyが好きだから!僕は死にません! で、泣き止んで家に帰ってから書く。
170 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:05:35 ] 何という昭和からの平成w っていうか平均年齢おかしいだろこのスレ
171 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:12:38 ] いま従事している ruby のプロジェクトで、 ソースファイルの改行コードがばらばらになっていることに気づきました。 開発は Windows、本番環境はLinuxです。 Linux の LF に合わせようと思いますが、質問です。 Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか? たとえば、Windows 上で、改行コードが LF のソースを動かす、など。 もし問題ないのならば、そのままにしてしまおうかなとも考えています (sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
172 名前:デフォルトの名無しさん [2009/04/08(水) 19:20:16 ] なんか精神的に嫌だな。
173 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:31:29 ] >>123 RSpecの書籍がでるらしい。今はpdf版が無料で読めるみたいだ。 RSpec 本 1 章のメモ - たかみやの日記 d.hatena.ne.jp/ytakamiya/20090407/1239078380
174 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:00:39 ] >>174 Ruby1.9.1 をアンインストールして Ruby 1.8.7 を使え
177 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:00:44 ] >>174 ttp://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18 マジックコメントを書きましょう
178 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:11:56 ] サポートしてくれるものが無い場合は>>176 が正解 1.9.1を解説してくれる何かを頼りに学習してる場合はここで躓く可能性はないわけで、 つまりは1.9.1を教えてくれる教科書に該当するものを持ってないってことで そういう場合は無理せずに1.8.7を使ってRubyに慣れるのが吉 一生のうちに1種類の言語しか学習できない呪いがかかってるとかそういう場合は別途相談
179 名前:174 mailto:sage [2009/04/08(水) 21:14:45 ] レスありがとうございます >>176 できれば最新版を使いたいのですが、1.8系は1.9系より日本語の使用が楽なのでしょうか? >177 マジックコメントを記述した結果 puts "あ" は実行できました! しかし、残念なたら表示は文字化けしたままです また、日本語を含むファイルの文字化けも直りません 表示するときに、文字コードを指定するような方法はないのでしょうか? よろしくお願いいたします
180 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:21:43 ] 最新版だって判断できるくらいRubyに習熟してるなら自力でやれ
181 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/04/08(水) 21:29:30 ] 結果は同じだけど、(1)のほうも puts line.encode(Encoding.default_external) のほうがいいかな
183 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:33:02 ] >>181 初心者に後者勧めるとかマジキチ
184 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 21:40:31 ] 初心者向け書籍は1.9.2になるまで出ないんじゃないかと最近は思う
185 名前:174 mailto:sage [2009/04/08(水) 21:59:21 ] レスありがとうございます おかげさまで、無事できました def my_puts str puts str.encode(Encoding.default_external) end なる関数を作成し、putsの代わりに使用しています これから、日本語を含んだ正規表現の利用を試します また何かありましたら、よろしくお願いいたします
186 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:03:12 ] Windows版のコンソール(cmd.exe?)への出力を諦めれば、相当楽になるような気がする。 例えばファイルにそのまま出すとか。 敢えて茨の道を進む>>185 (>>174 )に祝福あれ。
187 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 22:06:30 ] 1.8.7なら倍のスピードで学習できるけどな 悲惨だ
188 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:26:28 ] nkf で変換とかだめなの? by 初心者
189 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:36:08 ] nkfじゃutfがだめじゃない?
190 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 23:36:51 ] UTFも扱えるけど標準出力に書き出すたびにNKF呼ぶんだぞ 死ぬほど面倒じゃないか
191 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:12:04 ] >>190 何その Ruby 1.8 以前を全て敵に回した発言
192 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:42:28 ] 以前と未満を間違えるとプログラムは動かないぞ
193 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:34:11 ] <バージョン>Ruby 1.8</バージョン> <時間>以前</時間> <バージョン>Ruby 1.8</バージョン> <バージョン>未満</バージョン>
194 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 08:41:13 ] 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 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 08:44:38 ] p するからだ do〜end ブロックを関数的メソッドに渡したい場合は引数全体を ( ) で括れ 理由は省くが、空白の有無でパースがコケている
198 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 09:28:12 ] do〜endと{}では結合度が違う do 〜 end → おおもとのメソッドに結びつく { 〜 } → 直前のメソッドに結びつく no1ではブロックがpに結びついてるからだろう
199 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 10:27:52 ] つまり、最初のは p(a.inject(0)) {|sum, x| sum += x } と見なされとるわけよ
200 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 11:57:14 ] >>194 いやーそれが、win32のプログラムをcygwin上で動かすと不具合あったりしますよね…。 Ctrl+C押すとcygwinアプリには届くけど、ネイティブアプリには届かずに落ちちゃったり。 (Railsスレにも書きましたけど) まあ結局は、仮想環境か専用サーバーかのLinuxにターミナルでつなぐか、 coLinux、andLinuxでも入れろやってことになりそうですけども
202 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:08:53 ] ひとつ質問いいですか? kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか? けっこう特に後者に(俺が)未だにハマるんですよ。 MLのログみると、trap:kconvにあるような半分バグ的仕様だけど、変更点としては大きいからそのまま、 みたいな感じですが。 kconvで-m0とか-Xはずすような、 モンキーパッチみたいなのってないんでしょうか?
203 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:21:07 ] いまだにkconv使ってるやつのほうが博物館行きだからじゃないかな
204 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:32:04 ] > kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか? x nkf の -m0(MIMEデコード) o nkf の -m(MIMEデコード) >>203 ええええ('A`) なら、String.toutf8 みたいなユウワクに駆られるようなメソッド用意しとくんじゃねーよヽ(`Д´)ノ ウワァァン!!
205 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:24:57 ] >>200 レスどうもありがとうございます。参考になりました。 改行コードが混在したソースの状態でも、とりあえず問題なく動くということで安心しました。 shebangの問題は大丈夫です。 今回はRails + Rubyによるバッチで、Linux上で shebang で起動される ソースは、ただしく LF になっていました。
206 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:31:50 ] しかし誰も配列の話はしていなかった
210 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:36:17 ] >>209 現象は一緒じゃん 要はメソッドチェーンが切れてるだけだし、メソッドチェーンのレシーバがnilになりうるときと対処が全く同じ n次元配列のクラスを標準で添付しなかったのは悪意だと思う
211 名前:206 mailto:sage [2009/04/09(木) 15:53:32 ] >>207-210 ちょっと衝撃的な事実。大変勉強になりました。 多次元がなく、判定が if h['a'] && h['a']['b'].nil? と煩雑としたら、 多次元を扱わない別の方法でデータを扱っているんですか?
212 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:54:00 ] けっこういろんな人が困ってるな、2次元構造のコレクションの nil 問題 「データに nil があるとエラーになります」とか苦しい説明をしてる人も…
213 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:57:02 ] デフォルトでおすすめできる多次元配列のライブラリもないしな。
214 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 16:04:49 ] >>211 概念的にも構造的にも多次元ではないので「配列のネスト」「ネストしたハッシュ」などとお呼びくださいまし で、Ruby ではいわゆる番地でコレクション(配列、ハッシュ)にアクセスすることはそう多くない コレクションの each メソッドを使って枚挙するか、そういうアクセスを基本としてデータ構造を考える んが、配列のインデックスやハッシュのキー決め打ちでネスト先にアクセスすることも多くて、 「あ、そうか、最初のが nil になればこれってエラーか、めんどくさいなあ」と言って h[key1][key2] が h[key1] && h[key1][key2] になるのは日常茶飯事 だから、もし、本当に、番地による多次元アクセスが大量でメインな仕事をするつもりなのなら、Ruby は使わないほうがよい
215 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 16:05:46 ] ここでサクッと2次元配列みたいに扱うハックがキボン
216 名前:211 mailto:sage [2009/04/09(木) 16:09:40 ] >>214 ひやー。パラダイムシフトが求められるのですね。 ありがとうございます。
217 名前:211 mailto:sage [2009/04/09(木) 16:15:20 ] 僕もハッカー待ちます><
218 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 16:32:28 ] h = {} h['a']['b'] = "hello" をする定石はなんでしょうか?
220 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 16:37:57 ] 誰でもわかる勘違いのない方法 h = {'a' => Hash.new} h['a']['b'] = "Hello" 「ハッシュにあるキーでアクセスしてキーが存在しなかった場合、特定のオブジェクトを代わりに作ってそのキーに対する値とする」 という動作をさせることもできるが、読むのめんどい どっかで書いたので誰かが書くと思う
221 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 16:45:34 ] >>220 早速ありがとうございます。その「ハッ(略」にも興味があります。 それは h = {'c'=>"aa"} h['a']['b'] = 'hello' の場合、h['c'] を消さない方法でしょうか?
224 名前:218 mailto:sage [2009/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 mailto:sage [2009/04/09(木) 16:47:52 ] >>220-222 ありがとうございます! >>221 の方法で >>223 は実現できたので取り下げます。 うーん。確かにどれも直感的な方法ではないので、別のデータ構造を考えます。
226 名前:デフォルトの名無しさん [2009/04/09(木) 16:48:29 ] ハッシュを構造体の代わりとして用いることは 是か否か、について教えてくさい。
227 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 16:50:52 ] メンバが有限ならStruct、そうでないならHashという私見です。
228 名前:デフォルトの名無しさん [2009/04/09(木) 16:55:00 ] とりあえず否 構造体用のクラスがRubyには用意されているため。 これが満足できない回答なら、情報小出しにすんなといいたい
229 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 16:56:30 ] >>226 /) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ / 他の言語の構造体に完全に該当するクラスはRubyにはない >>227 のように Struct が標準でついてくるが、 ぶっちゃけ「つけた名前のメソッドでもアクセスできるなにやら便利な配列」以上の使われ方はしないので好きにしれ Struct を使って怒る人は特にいない
230 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:02:15 ] haの返り値は最後に評価された式つまりその代入式の値。 代入式の値は右辺の値。 早とちり乙。hはちゃんと変わってるはず。
233 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:03:33 ] >>230 よくわからないものを無理して使うからよ
234 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:05:48 ] >>233 自分で泥臭くでも作れば間違いないのにね 借り物を使うから、どう動作してるのかがわからなくなる…
235 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:07:42 ] イディオムを教えるっていうのは、それを分解して どういう動作なのか調べて自分の肉として取り込んでもらうってことだと思ってた。
236 名前:230 mailto:sage [2009/04/09(木) 17:08:49 ] >>232-233 ほ、本当だー。ありがとうございます。 Perl/PHP と比べると不思議ですが、面白いですねー。 >>221-222 , 224 などなど理解できてないので精進しますです。
237 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:45:05 ] >>202 お前は俺か、ってくらい、昨日同じことで悩んでた。 >>203 今は何使うのが常識なのか教えてー。 1.8.x で。
238 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:53:58 ] 常にh['a']['b']などと二段階でしかアクセスしないなら、そもそもHashをネストさせる意味はない。 h[['a', 'b']] = "Hello" とでもしとけ。
239 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:58:03 ] うわぁ・・・
240 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:10:01 ] ベンゾウさんの中・・・
241 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:21:44 ] >>238 rails の select ヘルパーが <select name="a[b]"> という名前になるんです。 なので params['a']['b'] が空の場合とかの処理に必要で。 rails はどうなっているんだろうなぁ。
242 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:47:30 ] param["a"]["b"]にアクセスするときって ["a"]が無い時点で処理続行不可能なパターンが大抵だから returnなりraiseなりでさっさと脱出してるな。railsはしらね。 return unless param["a"] if param["a"]["b"]
243 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:47:57 ] そもそも、別にkconvやNKFが時代遅れなんて事はないと思うが 今でも主流って位には使われてるはず
244 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:50:00 ] >>207 の方式が一番素直だな。
245 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:16:04 ] params['a']['b'] rescue nil
246 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 12:36:18 ] eval ってなんて読むの?
247 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 12:41:50 ] >>246 イバル evaluate のことなのだから、イバル 日本では evaluate を踏まえてもなお「えばる」と読まれてる気がするので もうエバルでいいよという気がするが、本来はイバルと読むべき ちなみにイーバルは「俺の昼飯シャキヴェントゥー」並に間違ってカッコわるい表現なので避ける
248 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 13:24:21 ] _,,-ー----.、 <" "l '; ,、、__ソ^`7, i、 ';'___ _,,, リ トーj 'ーー r ヽノL ヽ ノ < シャキヴェントゥー ヽ∀ / ー'
249 名前:202 mailto:sage [2009/04/10(金) 13:27:30 ] kconv直したのを作ろうと思うんだけど(gem化しとくと便利かね) 名前何がいい?
250 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 13:30:36 ] jconv
251 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 13:36:48 ] >>249 kconv2
252 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 13:57:35 ] EUC-JPとJISとShift JISとUTF-8の相互変換に、 Japanese以外のどんな需要があるというのか
255 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 14:07:07 ] >>254 一応、 Latin の文字と UTF-8 文字の変換の需要はある 日本人ジャナイヨモードにした場合はSJIS/EUCはLatinだとみなして変換してくれるとか
256 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 15:15:17 ] >>252 Gemのrefeはもう手付かず。 なんでかってーと るりま のDB引くコマンドになったから。
257 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 17:16:59 ] >>256 kwsk
258 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 17:26:38 ] ttp://doc.loveruby.net/wiki/ReleasePackageHowTo.html
259 名前:デフォルトの名無しさん [2009/04/10(金) 18:17:15 ] きばる