Ruby 初心者スレッド Part 18

このエントリーをはてなブックマークに追加
891デフォルトの名無しさん:2008/04/07(月) 18:28:38
うん、いいとこに気づいたな
String に << を使うと、オブジェクトはそのままで末尾に文字列が追加される
String に += を使うと、以前の文字列と足す文字列を足したものが新しいオブジェクトになる

本当に必要なのはただの長々とした文字列であるはずで、
毎回新しくオブジェクトが生成されるというのはとても無駄だ
892デフォルトの名無しさん:2008/04/07(月) 18:40:40
str の末尾に 'hoge' を追加する、という処理を体現するコードは
str = str + 'hoge'
ではなく
str << 'hoge'
である、というだけなんだけどね
str + 'hoge' が返すオブジェクトは str とは何の関連性もない

そんなん好みだろ、と言われてしまうとどうにもならんが、かといって
「str がメガ単位の大きさになるかもしれないから今回は + 使うのやめる」
というブレた判断をするのはそれはそれでとても不恰好だろ
893デフォルトの名無しさん:2008/04/07(月) 19:00:23
>>890-892
なるほど、そんな違いがあったのですね
ありがとうございました
894デフォルトの名無しさん:2008/04/07(月) 19:04:28
このへんがわかるとRubyが面白くなるが、症状が変なほうに進むと
「URIクラスにreplaceが無いのは変だ」とか言いだすので注意
895デフォルトの名無しさん:2008/04/07(月) 19:21:37
URIにto_strがないのが不便です
896デフォルトの名無しさん:2008/04/07(月) 19:38:07
せっかく削ったのに…
897デフォルトの名無しさん:2008/04/07(月) 19:57:33
まあ、パフォーマンス度外視なのがスクリプト言語だしね。
898デフォルトの名無しさん:2008/04/07(月) 20:22:00
require 'rubygems'したあとYAMLでファイルに保存するんだけど

File.open(file, "w") { |f|
YAML::dump(data, f)
}

と書いてしまうのはWindowsのbinnmodeとかあのへんの問題はない?
899デフォルトの名無しさん:2008/04/07(月) 20:56:42
>>898
……多分。
……YAML はテキストだし。
……まあ不安なら "w" を "wb" にでもしたらよろし。
900デフォルトの名無しさん:2008/04/08(火) 09:46:26
そこまで書いた上に気になってるなら、素直にbinmodeにすればいいと思う。
害はたぶんないだろう。
901デフォルトの名無しさん:2008/04/08(火) 10:46:31
DOSISHではないプラットフォームでも
テキストモードなら\r\nも改行文字として扱ってくれると便利なんだけど、
そうなっていない理由ってあるのかな。
日ごろ区別する必要のない人たちには不要な機能だから?
902901:2008/04/08(火) 10:50:24
あ、>>901はテキストモードでの読み込み時の話ね。
903デフォルトの名無しさん:2008/04/08(火) 11:08:51
universal newlineだね。
導入しようという話はあるんだが。
904デフォルトの名無しさん:2008/04/08(火) 23:58:37
ゲーム作ろうとして、MyGame(Ruby/SDL の Windows バイナリ同梱)
をダウンロードしたんですけど、なぜかインストールできません。

だれか詳しい方、助けてください。(ちなみにOSはvistaでActiveRubyはインストール済みです)
905デフォルトの名無しさん:2008/04/09(水) 00:19:23
>>904
どの段階で失敗するのかをできるだけ詳しく書きましょう
906デフォルトの名無しさん:2008/04/09(水) 00:22:39
どうせ一人の力だけでは無理なんだし要点まとめる練習だと思うべし
質問のために要点まとめて問題点洗い出してたら解決したという困った事態がザラにある
907デフォルトの名無しさん:2008/04/09(水) 00:39:24
>>904
すみませんでした。もうちょっと詳しく書きます。
http://dgames.jp/archive/mygame/でmygame-0.9.1-rubysdl-1.3.0-mswin32-1.8.5-p12.zipをダウンロード

デスクトップ上で展開

MyGameフォルダ内のinstall_mygame.rbをダブルクリック
コマンドプロンプトが起動して、終了。

MyGameのインストール確認のため、ruby consoleで「ruby -r mygame/boot -e ""」
と入力するが、以下のようなエラーメッセージが表示される。

C:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/mygame.rb:1:in`require': no such
file to load -- sdl (LoadError)


こんな具合です。
908デフォルトの名無しさん:2008/04/09(水) 00:55:59
>>907
書いてある通りだろ
本来ならあるべき場所にsdl(sdl.rb)がないから、ロードに失敗した
その構造だとC:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/sdl.rbがないのだろう

おそらく何かの原因でインストールに失敗している
909デフォルトの名無しさん:2008/04/09(水) 01:46:42
>>908
すみませn。ruby初心者どころかPG初心者レベルなので、具体的にどう対処すれば
よいのかわかると幸いなんですが・・・。
910デフォルトの名無しさん:2008/04/09(水) 01:49:49
>MyGameフォルダ内のinstall_mygame.rbをダブルクリック
>コマンドプロンプトが起動して、終了。

ホントはここでエラーメッセージが印字されてるんだろうなぁ…。
コマンドプロンプトから実行してみるとか。
911デフォルトの名無しさん:2008/04/09(水) 02:01:29
>>910さんのアドバイス通りやってみました。

・・・が結果は同じでしたorz
912デフォルトの名無しさん:2008/04/09(水) 02:49:21
いや、なにも改善してないんだからまた失敗するのは当たり前で…
コマンドプロンプトから実行しただけで良くなるわけが無くて…
エラーメッセージが吐かれたならそれを読み解けといってるわけで…
913デフォルトの名無しさん:2008/04/09(水) 02:57:48
Rubyは高級言語なのでWindowsユーザは別の言語をお使い下さい
914デフォルトの名無しさん:2008/04/09(水) 05:07:37
>>907
# 使ってないから知らんけどvistaなのが悪いとか?
mygame/rubysdl-1.3.0-mswin32-1.8.5-p12/README.ja.win32 読んでみ
特に 3.1 のところ
で、然るべき場所にそれらのファイルがあるかどうか確認
915デフォルトの名無しさん:2008/04/09(水) 08:46:36
>>909
ここは人力検索サイトじゃない
コマンドプロンプトが起動できるぐらいなら、まず自分で出来る限りのことをやれ

少なくとも
1. コマンドプロンプトの実行結果をきちんと読む
2. sdl.rbが存在するかどうかを確認する
ぐらいはできるだろ?

あときちんとsage
916デフォルトの名無しさん:2008/04/09(水) 10:09:08
html の table を生成するループってどんな風に書くのがいいの?
今こんなんなんだけど
<table><tr>
<% for data.each_with_key{|x, i| %>
<td><% x.name %></td><td><% x.value %></td>
<% if i % 5 == 0 %></tr><tr><% end %>
<% end %>
</tr></table>
917デフォルトの名無しさん:2008/04/09(水) 10:23:03
ERBならそれでいい
HTMLとして読みやすいことが第一
Rubyとしての論理構造を気にするなら最初からRubyで書け(w
918デフォルトの名無しさん:2008/04/09(水) 10:41:30
システムが使ってなくて目立つprefixってなにかありますか?
_myvar =3 は一応通るみたいですが。
919デフォルトの名無しさん:2008/04/09(水) 10:57:16
エディタにハイライトしてもらうといいぞ
背景を黄色にするとか目立って良さげ

いやわりとマジで
目立つかどうかを名前に負わせるのは不条理

マニュアルに「使える文字」が説明されてるからそれから好きなの選べ
ttp://www.ruby-lang.org/ja/man/html/_BBFAB6E7B9BDC2A4.html
920デフォルトの名無しさん:2008/04/09(水) 11:42:24
>>917
縦にデータ並べたいときとか列の数変えるとき便利かと思ったんですけどこのままでいですかね
921デフォルトの名無しさん:2008/04/09(水) 12:53:13
>>946からはそういう目的があるとはあんま読めんな

メソッドにして切り出すとスクリプトとしてもうちょっと明快になる気もするが、
ERBならそのまま記述したほうがおそらく素直
ERB使ってるのにRubyスクリプトとして凝らせるというのは方向性が逆

<table><tr>
<% for data.each_with_key{|x, i| %>
<% data2cell_and_print_sepalater_per_5(x,i) %>
<% end %>
</tr></table>

と書いたとしてもERBとして可読性はあがらない
あとeach_with_keyってなんじゃらほい
922デフォルトの名無しさん:2008/04/09(水) 20:32:25
スレ違いだったらスルーして。
Rubyにredmine入れたんだけど、
英語表記なんだよね。

redmineの設定メニューで
Japaneseにしてるのに英語のまま。

だれか経験したことないですか?
923デフォルトの名無しさん:2008/04/09(水) 22:40:35
rubyの中からシェルの環境変数を設定するにはどうしたらいいですか?
ENVに代入しても、Rubyの中だけでしか有効ではないようです
924デフォルトの名無しさん:2008/04/09(水) 22:56:01
>>923
まあそりゃそうだろ
「自分」が起動したシェルにしか自分が設定した環境変数の効果は及ばない
「他人」が起動したシェルにも設定を及ぼしたいのなら、OSが管理するシェルの起動設定そのものに手を入れるしかない
それはRubyの仕事ではないので、使ってるシェルの設定ファイルとか設定コマンドとかを直接編集すれ
925デフォルトの名無しさん:2008/04/10(木) 00:56:44
>>922

インストール時の rake load_default_data で ja を選んだ?
あと、ユーザごとに表示言語の設定があるので、マイアカウントの設定で日本語を選んで。
926デフォルトの名無しさん:2008/04/10(木) 09:38:38
>>924
Rubyでシェルのコマンド文字列を生成して、シェルのバッククオートを使うとか、
Rubyの中からサブシェルを起動するとか。
927デフォルトの名無しさん:2008/04/10(木) 13:04:18
脱初心者の目安ってありますか?
928デフォルトの名無しさん:2008/04/10(木) 13:08:30
>>926
同じことだろ
929デフォルトの名無しさん:2008/04/10(木) 13:22:56
>>927
Ruby学習者の15段階

レベル0: Rubyを宝石の名前以外に思いつかない
レベル1: 関数的メソッドだけで乗り切る。ドットの意義がわからない
レベル2: 関数的メソッドを自作する。ドットを「〜の」と訳すがオブジェクトはよくわからない
レベル3: クラスを形だけ自作するがinitializeのスペルを間違える。printfをダサいと感じるようになる
レベル4: モジュールを形だけ自作するようになる。RubyをBetterPerlだと吹聴するようになる
レベル5: cgi.rbを読んで絶望する。array.rbを探すがRubyスクリプトとして存在しないことに憤りを覚える
レベル6: 自作のスクリプトを公開するがバージョン0.1.3で放置される。「それRubyでもできますが」が口癖になる
930デフォルトの名無しさん:2008/04/10(木) 13:31:29
うわ間違えた、printfではなくsprintfね
ちなみに
「全てを自作オブジェクトで表現しクラス構造が網の目のようになる」
のレベル7の次くらいで有用性を許容します
931デフォルトの名無しさん:2008/04/10(木) 13:37:31
添付ライブラリのソースを読めるくらいが初心者脱出の目安だと思う…
何やってんだかさっぱりわからん、といううちはまだ初心者ということで
932デフォルトの名無しさん:2008/04/10(木) 14:42:05
optparseを読めないと初心者脱出にならないのか!
933デフォルトの名無しさん:2008/04/10(木) 15:06:39
あれはコメント部分に AA 解説がある時点で危険信号が点ってはいるな
身近なとこで net/ の下くらいでいいんじゃないかとも思う
comlex.rb とかも数学の知識ないと読めねーぞ
934デフォルトの名無しさん:2008/04/10(木) 20:08:47
>>925
それでした。
マイアカントから設定できたんですね。

てっきりsettingからやるのかと思ってました。
935デフォルトの名無しさん:2008/04/11(金) 03:53:51
あるディレクトリの配下を、別のディレクトリの配下に再帰的にコピーしたいです
シェルだと、
cp /path/to/src/* /path/to/dest/
でコピーできますが、これをRubyでやろうとして、
FileUtils.cp_r('/path/to/src/*','/path/to/dest/')
と書くとエラーになります。
うまくコピーするにはどう書いたらいいですか?
936デフォルトの名無しさん:2008/04/11(金) 03:54:38
シェルの場合
cp /path/to/src/* /path/to/dest/ -r
でした
937デフォルトの名無しさん:2008/04/11(金) 04:09:47
ワイルドカードがいらないんじゃないの
938デフォルトの名無しさん:2008/04/11(金) 07:15:27
>>935
FileUtils.cp_r(Dir.glob('/path/to/src/*'),'/path/to/dest/')
939デフォルトの名無しさん:2008/04/11(金) 08:42:10
マニュアルくらい読んどけって話だな
30秒もあれば理解できることだったのに
というか、シェルじゃないのにシェルグロブが利用できると考えるのがそもそもおかし以下略

> FileUtils.cp_r(src, dest, options = {})
> src を dest にコピーします。src がディレクトリであったら再帰的にコピーします。
> その際 dest がディレクトリなら dest/src にコピーします。

> FileUtils.cp_r(list, dir, options = {})
> list[0]、list[1], list[2], ... をディレクトリ dir の中にコピーします。
> list[n] がディレクトリなら再帰的にコピーします。

ということで、ファイルパス文字列かファイルパスが入った配列のどっちかしか受け付けね
940デフォルトの名無しさん
Dir.glob がライブラリの内部で正規表現使って記号を探して
自前でディスクを走査して配列返してるだけってのを知ったときはちょっとショックだった