[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 14:15 / Filesize : 278 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 27



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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

116 名前:デフォルトの名無しさん [2009/04/07(火) 13:30:59 ]
すみません。Cで拡張ライブラリを書くためにREADME.EXT.jaを
読んでいるのですが、次のような箇所があります。

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

これが書かれてから15年近く経った今でもそうなんでしょうか?
日本語・英語問わず、どこかに一覧表があれば欲しいのですが・・・。

117 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 18:07:07 ]
rspec で BDD だとかなんかそんなのやってみようかなーと思ってるんだけど、
これってパブリックなメソッドの返り値しかチェックできないの?
いくつも小さなメソッドに分割された、ある程度フクザツなメソッド作ってる最中は役に立たない?

118 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 18:22:29 ]
>>117

「作り始め」のメソッドの大きさはみんな一緒

119 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 18:34:39 ]
tdiary 以外でテーマやスキンの充実した ruby アプリって何かありませんか。

120 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 19:31:53 ]
Hiki

121 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 19:34:59 ]
>>116
スレ違い

122 名前:119 mailto:sage [2009/04/07(火) 19:55:35 ]
tdiary と同じテーマやスキン以外でお願いします><

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

Ruby ベースの CMS
ttp://diaspar.jp/node/79
をみてもテーマ公開しているの少ないよね…。

123 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:01:41 ]
>>117
RSpecでテストとか勉強しようと思ってずっと待ってるんだけど、そういう解説は見たことないね
なんかテストのなんたるかを知ってる人が自由に使ってる感じがして、ちょっと寂しい
個々のマッチャとかの動作はわかりやすいんだけど、実際にこれどう使うのよみたいな

124 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:08:10 ]
モデル・ビュー・コントローラの知識がないとたぶんダメ



125 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:27:18 ]
>>122
PinkyBlog

126 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:29:47 ]
>>123
TDDは俺もよくわからんので勉強中。

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

Amazon.co.jp: 10日でおぼえる Ruby on Rails入門教室: arton: 本
www.amazon.co.jp/dp/4798114723
images-jp.amazon.com/images/P/4798114723.09.MZZZZZZZZZ.jpg

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

家でだらだらスクリプト書いてるだけだしこれくらいでいいじゃんとこれまでは思ってたけど、ちょうど足りない
少なくとも19が欲しい
大きめフォントをちょっと小さくしたけど、やっぱ足りん
うおー

128 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:37:27 ]
△ ブロックの返り値で要素を置き換える
○ ブロック内で最後に評価された値が要素と置き換わる

ブロックつきmapの「ブロックの返り値」は変換後の配列だ
ブロックで最後に評価された値のことをブロックの返り値と呼んではいけない

133 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 08:53:51 ]
× if 文
○ if 式

公式でも if 文って書いてしまってるけどな
既存言語の影響は強い

134 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 09:30:31 ]
Rubyでは文も式なだけであって、文を文と呼ぶのが誤りなわけではない。



135 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 09:59:47 ]
最新のparse.yを見る限り、
symt→expr→arg→primary→if という流れになってるので、
ifは式です。

136 名前:119 mailto:sage [2009/04/08(水) 10:30:51 ]
>>125
ありがと。
「CSS着せ替えテンプレートプロジェクト」の存在も知ることができて感謝。

137 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 11:10:14 ]
>>133-135
Rubyでの文は「カッコなしのメソッド呼び出しの引数よりも優先順位が低い式」のこと。


139 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 11:25:04 ]
>>139
ごめん。コピペミス・・・

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

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

ていうか、調べてたら cygwin から nativeアプリに(non-cygwin app) Ctrl+Cは鬼門みたいですね…。

141 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:04:44 ]
>>133
○if文
◎if式

こうでしょ?
例えば関数呼び出しは式であり文でもあり。

142 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:07:16 ]
とりあえず一つだけ。
初心者スレに過度の原理主義はあんまりよくない。
やりたいなら、本スレにコピペでも持って行って存分にやればいいと思うんだ。

143 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:19:15 ]
すまんかった。正直ifの扱いはどうでもいいんだけど
「文は返値を持たないものだけを指す」と言わんばかりなのが気になって。
初心者スレだけになおさらね。

144 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:20:23 ]
文が値を返すのって感覚的にも不自然だと思う
if は if 式と意図的に呼ぶべき
初心者スレならなおさら、初期の用語の統一は非常に重要
ttp://www.google.com/search?hl=ja&safe=off&num=50&q=Ruby+%22if%E5%BC%8F%22&lr=lang_ja
ttp://www.google.com/search?hl=ja&safe=off&num=50&q=Ruby+%22if%E6%96%87%22&lr=lang_ja
うおー負けてるー



145 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:20:39 ]
式の一部になれないのが文だっけ?

146 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:22:08 ]
ifが式ってのが、Rubyの特徴のひとつだもんな。

147 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:27:06 ]
「if 式」のほうが実態をよく表してるし勘違いの元にもならないし興味の取っ掛かりにもなる
つい口に出るもんなので仕方ないが、なるべく式と言うべきだと思った

ちなみに、 for なんかは式だったかどうかをよく覚えてないので
「制御構造 for」とかいう表現で逃げたりする
大人は汚いね!

148 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:30:52 ]
>>145
あっちにレスした
pc12.2ch.net/test/read.cgi/tech/1238194350/50

149 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:31:38 ]
>>145
pc12.2ch.net/test/read.cgi/tech/1238194350/50
> ( ) で囲めばなんでも式の一部 (primary) になる。

150 名前:149 mailto:sage [2009/04/08(水) 14:31:58 ]
>>148
ごめん_| ̄|○

151 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:40:39 ]
Cなどの既存言語の経験者が戸惑わないようにif文って呼んでるのに
その辺の事情を無視してif式って呼ぼうってのは、悪しき原理主義だよなあ

そういやこの前「関数って言うな」なんてのもあった
あれも根っこは一緒か

152 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:41:59 ]
>>151
既存言語の経験者が同じだと勘違いするほうが問題とか、
少しも思わない?

153 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:44:53 ]
初心者が引かない程度に抑えるのが肝要ってことでどうだろうか
スレの使い分け大事

154 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:55:49 ]
>>151
なんで違うものをわざわざ同じ名前で呼んで混乱させようと思うわけ?



155 名前:129 mailto:sage [2009/04/08(水) 15:14:57 ]
>>130-131

thx!

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

            無理せずに

そう呼べばいいじゃんね
無理して別の名前で呼ぶ理由もなかんべ

157 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 15:48:45 ]
>>117で話が出たので自分用スクリプトでちょっとやってみた
小さなメソッドひとつにつき正常と境界と例外で8つくらいずつテスト項目作る羽目になって非常にめんどくさい

別なとこ改造してもspecのテストさえ通ればとりあえず他への影響を忘れて次のことをしていいというのは気楽

158 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 16:45:49 ]
a.map!{|s| s.sub(/var/, 'foo')} をもっと短く書く方法ってありますか?

なくてもいいのですが、なんか ruby ならありそうな気がして。

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
ひやー。パラダイムシフトが求められるのですね。
ありがとうございます。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<278KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef