トップページ⇒tech
983コメント375KB

Ruby 初心者スレッド Part 41

■ このスレッドは過去ログ倉庫に格納されています
0001京 ◆SsSSsSsSSs 2011/02/10(木) 13:47:51
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0381デフォルトの名無しさん2011/03/08(火) 14:27:03.60
>>378
セキュアは「安全」という意味で、
大体こういう場合は「セキュリティ的に問題がない」みたいな意味。
ネットの辞書で調べられるでしょ。

ランダム文字列がいいなら、
現在時間のTimeオブジェクトにランダム数値の文字列をくっつけてハッシュとか、
かっこつけたければsaltとして真ん中に適当な文字列を入れ込むとか。
まあなんでもいいと思うよ。

>>379
ああ、エロ画像の一括ダウンロードとかか
0382デフォルトの名無しさん2011/03/08(火) 14:33:46.81
>>378
「セキュアな」というのは、
悪意のあるユーザーが乱数の規則性を発見しようとしても困難だという意味
単に衝突を回避したいというのであれば、
乱数を元に十分なだけ文字列を並べればいい

そうすると乱数の種が問題だが、まあ現在時刻とかでもいいかもね
あんまり厳密なことを求めてないようだし
0383デフォルトの名無しさん2011/03/08(火) 14:40:49.54
>>380
コリジョンについてのはどうなんだろうね
そのへん脅すとたいてい連番でいいよって言ってくれるもんなんだが

いや、衝突なんてまず起きないけどさ…
0384デフォルトの名無しさん2011/03/08(火) 14:46:59.77
ひとえに「万一衝突が起きたらどうなるか」によるな
地球が爆発しますとかなら連番にしておいたほうが無難
過去のファイルが上書きされて公開されますとかなら菓子折りでも持って謝りに行っとけ
0385デフォルトの名無しさん2011/03/08(火) 14:51:40.10
Rubyに向いてない処理ってどういうのですか?
0386デフォルトの名無しさん2011/03/08(火) 15:07:20.31
Ruby 関係ないけど、連番+乱数みたいなフォーマットにすればコリジョンは発生しないのでは?
03873752011/03/08(火) 15:25:19.08
皆様ありがとうございます。
しかし乱数発生器という概念がやはりよく分かりません。。

たとえば以下のようにランダム文字列を作った場合、

source = ('a'..'z').to_a + (0..9).to_a
a = Array.new(10){source[rand(source.size)]}
a.join

同じくa~zと0~9を用いてこれよりランダムな10桁の文字列を作るのは不可能ではないですか?
全ての桁で何にも依存せずにランダムに文字を決めているのだからこれ以上分散させようが無いと思うのですが。
推測もしようがないと思います。
0388デフォルトの名無しさん2011/03/08(火) 15:35:53.77
連番というか、日付をプラスするというのはよく見るね
/upload/20110308/a8b3c7f382.jpg
これなら万一の場合の被害範囲も小さいので説得も簡単だろう
その日のディレクトリ内のファイルなんて多くて1万とかだろ(適当)
「本日のディレクトリ内にファイルが既に存在したら再抽選」という処理でも間に合うはず

まあ、そんな小細工しなくても、結果の文字列がじゅうぶんに長ければ衝突の心配はほぼない
正確を期すと「衝突しないわけではありません」と答えるしかないのが大変辛いところではあるが

Ruby関係ないな
0389デフォルトの名無しさん2011/03/08(火) 15:45:08.83
>>385
Rubyで実行して1秒以上かかるような処理は本質的に向いてない
まるちめでぃあとか数値計算とかGUIぐりぐりとかあのへんは苦手分野だ
一般的なゲームも、他の言語と比べた場合はあんまり得意とは言えない
頑張ればなんとかならなくもないのだが、「敢えてRubyでやることに意義がある」という状態なので、
結果が欲しいだけという一般なピーポー様は素直に他の言語で作ろうPythonとかどうすかPython

>>387
その rand() の精度が問題
たとえば、100万回を3回実行したけど毎回1が100個ほど多い、とかだと困る
乱数の種として oasjfoiefdasifj を与えると 4829384 番目の7文字目に同じ数字が出るとか
100万回の結果をプロファイリングすると乱数の種の4文字目は34パーセントの確率で1だとか
普段の使用ではこんなの気にするのは基地外レベルだが、乱数発生器としては失格

SecureRandom.hex とかが重宝されているのは、ランダム数字から16進数を導き出す計算に偏りがないため
rand() で被る確率と SecureRandom で被る確率そのものは、前者のほうがはるかに高いはず
SecureRandom 相当が自由に使用できるなら、乱数発生に SecureRandom を使用しない理由は何もないと思うよ
0390デフォルトの名無しさん2011/03/08(火) 16:38:47.31
被らない乱数製造機

ransuu = 1..1000000000.to_a.sort_by{|x| rand}

ransuu.pop
03913752011/03/08(火) 16:48:22.61
うーむ、とても難しいですね(汗)
今の自分にはちょっと理解できないですが、頂いたレスをもう一度じっくり読んでみます。
ありがとうございました。
0392デフォルトの名無しさん2011/03/08(火) 16:51:40.85
だから何も言わず SecureRandom 使え
天文学的確率でしか被りませんと胸を張れる
rand() は一意になる ID のようなものを作るのにはもともと向いてないのだ
0393デフォルトの名無しさん2011/03/08(火) 17:03:18.87
>>375
> 具体的にはユーザーから送られてくる画像に対して、出来る限りダブらないような任意のunique_idを振りたいのです。

1) スレッドセーフにシーケンスな整数を割り振り
2) 受付時間を整数にして使う

2ちゃんのdatなんかは後者でファイル名つけてるね。
03943932011/03/08(火) 17:04:24.51
あ、スレ読めてなかったスマソ…。忘れて…。
0395デフォルトの名無しさん2011/03/08(火) 18:35:34.34
>>372
1.9.2ならunicodeファイル名扱えるよ
0396デフォルトの名無しさん2011/03/08(火) 18:37:26.00
>>376
入力元データがないなら、乱数を使ってデータを作ればいい。
require 'digest/sha1'
seed = [rand(), rand(), rand(), rand(), Time.now.to_f].pack('ddddd')
p Digest::SHA256.hexdigest(seed)

ところでhexdigest()は0-9a-fまでの16文字を使うけど、これを0-9a-zまでの文字を
使うようにすれば、同じ情報量でも生成される文字列は短くできるよね。
0-9a-zまでなら36文字か。0-9a-zA-Zと'-'と'_'を使えば、64文字。
hexdigest()のかわりに、バイト列をこの64文字を使って表現する方法を
だれか教えてください。

0397デフォルトの名無しさん2011/03/08(火) 18:56:10.67
近いところで
SecureRandom.base64(32)
=> "97LXeNU4g2xG75E0qmvX0+kI34zJkw1+fh/XvJAvEOY="
0398デフォルトの名無しさん2011/03/08(火) 19:12:31.88
>>397
できれば任意のバイナリを受け取る方法が知りたい。
0399デフォルトの名無しさん2011/03/08(火) 19:58:08.87
>>398
ヒント:
 0と1の2文字しか使わない2進数
 0から7の8文字しか使わない8進数
 0から9の10文字しか使わない10進数
 0からfの16文字しか使わない16進数
 0から_までの64文字しか使わないのは
0400デフォルトの名無しさん2011/03/08(火) 20:02:17.95
ハッシュはキーがシンボルなら key:val って書けるじゃん
で値もシンボルなら key: :val ってなって見た目ががっかりなんだが
ここらへん開発陣に問題意識はある感じですかね?
0401デフォルトの名無しさん2011/03/08(火) 20:06:28.18
追いかけてないが、特になかったと思った
値もシンボルというのはそういうの的には稀だし
0402デフォルトの名無しさん2011/03/08(火) 20:08:27.01
Pythonを覚える場合はRuby覚える必要ってないですか?
0403デフォルトの名無しさん2011/03/08(火) 20:09:56.77
ない
0404デフォルトの名無しさん2011/03/08(火) 20:12:46.15
>>398
バイナリを6ビットずつに区切って、使いたい文字に割り当てればよろしい。
0405デフォルトの名無しさん2011/03/08(火) 20:14:43.65
つまりBASE64と
0406デフォルトの名無しさん2011/03/08(火) 20:38:07.26
そうですか。今日ちょうどそういうのがあったので
dir=Dir.glob '*.*'.encode Encoding::UTF_8
dir.each{|e| puts e.encode Encoding::WINDOWS_31J, undef: :replace, invalid: :replace, replace: '?'}
0407デフォルトの名無しさん2011/03/08(火) 21:05:05.66
>>404
それをやってくれる便利なメソッドかライブラリがないでしょうか。
0408デフォルトの名無しさん2011/03/08(火) 21:13:05.22
base64
0409デフォルトの名無しさん2011/03/08(火) 21:35:08.75
[SecureRandom.hex(16)].pack("H*")
0410デフォルトの名無しさん2011/03/08(火) 21:38:12.40
あーすまん。よく読んでなかった
0411デフォルトの名無しさん2011/03/09(水) 01:19:25.20
>>400
先日IRCでちょっと話題になったな
問題意識がないわけじゃないがノーアイディア
0412デフォルトの名無しさん2011/03/09(水) 10:07:55.18
劣化って程じゃないんだね
安心してPS3版買えるよ
教えてくれてありがとう
0413デフォルトの名無しさん2011/03/09(水) 11:54:14.36
どういたしまして
0414デフォルトの名無しさん2011/03/09(水) 12:42:49.62
>>411
というかJSON互換なんだから値は数値と文字列しか想定してないだろ
0415デフォルトの名無しさん2011/03/09(水) 13:05:56.75
>>414
JSON互換ならキーはクォートされた文字列でなければならない。
YAML互換と言うべきだろう。
0416デフォルトの名無しさん2011/03/09(水) 13:34:21.60
>>415
YAMLの仕様にはシンボルなんてない。
もしシンボルが使えたら、それはSyck独自拡張。
0417デフォルトの名無しさん2011/03/09(水) 13:34:51.73
てか所詮リテラルレベルで互換性語ってもかなり滑稽だ
「どっかから○○形式の記述をコピペしてここで使える」という以上の意義をまったく見出せない
0418デフォルトの名無しさん2011/03/09(水) 13:41:15.96
そうだ!
:key => :value
って表記法はどうかな?
0419デフォルトの名無しさん2011/03/09(水) 13:44:30.84
>>414-416の展開がそのまんま答だなw
みんなして「○○記述形式でよくある、なんかコロンで繋ぐやつ」という認識でしかねえw
だから実際に何形式なのかを言葉にするとガンガンすれ違う

解釈後に生成されるオブジェクトからして、Ruby引数オリジナルと考えるのが一番真っ当だと思う
0420デフォルトの名無しさん2011/03/09(水) 14:16:22.94
たぶんPythonのキーワード引数の踏襲。
0421デフォルトの名無しさん2011/03/09(水) 16:24:50.31
引数以外でも使えるよ
{kew: 'value'} => {:kew=>"value"}
0422デフォルトの名無しさん2011/03/09(水) 16:31:03.59
>>420
Matzの趣味的にはCommon Lispだろう
0423デフォルトの名無しさん2011/03/09(水) 22:32:49.71
Ruby1.9.2でWindowsのUnicodeテキストファイル UTF-16LE(改行:<CR+LF>)+BOM を
読み書きするにはどうしたらよろしいのでしょうか?

abc<CR+LF>
を読むとバイト列が [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10]
となってLFの2バイト目が分断されているようです

それとBOMの適切な処理方法があれば教えてください。
(設定によってBOMを読み飛ばしてくれたりバイトオーダーを設定できたりする機能があれば)

ソース
# coding: utf-8

$stdin.binmode
#$stdout.binmode

$stdin.set_encoding 'utf-16le'
$stdout.set_encoding 'utf-16le'

while row = gets
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10]
print '#', row
end


printのところでエラー
xxxx.rb:11:in `write': incomplete "\n" on UTF-16LE (Encoding::InvalidByteSequenceError)
0424デフォルトの名無しさん2011/03/09(水) 23:01:22.09
>>423
質問の一部にだけしか回答できないけど

> LFの2バイト目が分断されているようです
getsのline separatorが10 00ではなく10になっているとかじゃないか
0425デフォルトの名無しさん2011/03/09(水) 23:09:47.00
getsって意外とめんどくさいよね
0426デフォルトの名無しさん2011/03/09(水) 23:13:59.29
>>423
gets のあとで tell すると 11 と返ってきたけど、これって
次に読むのが最後の1バイト(00)っていう状態かしら。
0427デフォルトの名無しさん2011/03/09(水) 23:17:23.08
getsは使うときドキドキするね

$stdin.binmodeを外すとどうなるだろう
0428デフォルトの名無しさん2011/03/09(水) 23:19:50.29
gets は $/ を区切りとするんだけど、これがそのままだと 0x10 なので、
$/ = "¥r¥n".encode('UTF-16LE') としたらうまくいった。
BOMをむしるところまでは出来ないけど。

>>427
binmode は ascii-incompatible なエンコーディングを読むときに必要だと
怒られる。

0429デフォルトの名無しさん2011/03/09(水) 23:41:14.14
>>428
なるほど。やってみた

`set_encoding': ASCII incompatible encoding needs binmode (ArgumentError)

テキスト読むのにbinmodeにしろとか気持ち悪いね
BOM, $/ともども手当てしてあってもおかしくないんだけど
0430デフォルトの名無しさん2011/03/10(木) 00:03:48.58
NoMethodError: undefined method `to_utf8' for "\343\201\277\343\201\213\343\202\223":String
(#^ω^)ピキピキ
0431デフォルトの名無しさん2011/03/10(木) 00:07:24.88
(::゚∀゚::) そんなにピキピキしてないで俺でも食えよ
0432デフォルトの名無しさん2011/03/10(木) 00:07:52.94
$/ をケアするとして、こいつはあいにく特定のIOに結びついたものでは
ないので、やるとすれば、getsが毎回その時点での $/ を対象IOの
エンコーディングに合わせて変換することになるんだろうな。

IOインスタンスごとに line_delimiter みたいなプロパティを用意して、
デフォルトがそれになるようにするのがよいのかもしれん。
あれ、ないんだっけ…?

0433デフォルトの名無しさん2011/03/10(木) 00:12:40.29
getsはデリミタとして使用する文字列を引数にとるだろ
まったく試してないが gets("\r\n".encode('UTF-16LE')) でいけるはずだ
あと>>428はマカー
0434デフォルトの名無しさん2011/03/10(木) 00:38:45.19
WebKit通すとバックスラッシュが yen になっちまうからばれるんだよね…
04354232011/03/10(木) 00:51:17.63
改行の読み込みはデリミタ指定でうまくいきました。ありがとうございました。
BOMはとりあえず見てみぬふりをします。

# coding: utf-8

$stdin.binmode # バイナリモードでないとエラー :in `set_encoding': ASCII incompatible encoding needs binmode (ArgumentError)
# $stdout.binmode # バイナリモードだと改行が<LF>

$stdin.set_encoding 'utf-16le'
$stdout.set_encoding 'utf-16le'

while row = gets("\r\n".encode('utf-16le'))
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
 print '#', row.chomp, "\n" # <CRCRLF>対策
end
0436デフォルトの名無しさん2011/03/10(木) 01:08:58.29
BOMについてはまともに対応しようとすると大変らしいので(よくわからない)、
とりあえず$stdinを2バイトseekしてから使い始めとけばいいんじゃないかな。
0437デフォルトの名無しさん2011/03/10(木) 01:15:35.90
なにその誤爆するまで前進
0438デフォルトの名無しさん2011/03/10(木) 07:52:45.66
IO#getsだとちゃんと改行を読むね
open('hoge','rb:UTF-16LE') do |io|
while row = io.gets
p row.each_byte.to_a #=> [255, 254, 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
end
end
p $/ #=> "\n"

Kernel#getsの不具合なのかな
0439デフォルトの名無しさん2011/03/10(木) 08:07:06.44
それと、Ruby1.9.2だとBOM判別、読み飛ばし機能が付いてた
open('hoge','rb:BOM|UTF-16BE') do |io|
while row = io.gets
p row.each_byte.to_a #=> [ 97, 0, 98, 0, 99, 0, 13, 0, 10, 0]
p row.encoding #=> #<Encoding:UTF-16LE>
end
end

openのモード指定でexternal-encodingがUTF系のときBOM|をつけると
BOMを判別してエンコーディング決定&BOM読み飛ばし
BOMがなければ指定されたエンコーディングに

1.9でIOのクラスメソッドが ハッシュ引数をとるようになったので
IO.foreach('hoge',mode:'rb:BOM|UTF-16LE'){|row| p row.each_byte.to_a}
とかできる
でも
IO.foreach('hoge',binmode:true, external_encoding:'BOM|UTF-16LE')
みたいな external_encodingでの指定は効かなかった
対応し忘れ?
例によってドキュメントないけどorz
0440デフォルトの名無しさん2011/03/10(木) 08:26:13.93
> mode:'rb:BOM|UTF-16LE'

やっぱこの記法キモいわ
あ、でも1.9専用って示すのにはいいかも
0441デフォルトの名無しさん2011/03/10(木) 18:19:42.88
>>438-439
ほう……俺が考え付くようなことは既に実装されてるんだね

>>440
一瞬新しいハッシュの記法かと思った
0442デフォルトの名無しさん2011/03/11(金) 07:46:49.98
>>441
新しいハッシュの記法だと思ってた。
ハッシュじゃないならmode:の部分がベアワードでエラーになりそうな気がするから。
0443デフォルトの名無しさん2011/03/11(金) 14:13:43.92
Ruby初心者を脱した自覚くらいはあって、
これからかっこいい中級者になりたいなと思ってるんだけど、
そのために必要なぷろぐらみんぐちしきとかを勉強できる本とかないもんですかね
っていうか足りない知識ってなんだろう
0444デフォルトの名無しさん2011/03/11(金) 14:18:06.57
デザインパターンとかリファクタリングとかあのへんの本を読むと、今なら面白いかも
あとソフトウェアテスト関係
Webに関連する生活をしてるならHTTPのRFCとか

他人のライブラリソースを読むのもいいけれどね
0445デフォルトの名無しさん2011/03/11(金) 14:27:16.65
配列内の要素をソートしたいのですが、方法が分かりません。

具体的には、scoreというインスタンス変数を持ったBookクラスがあり、
このBookクラスのオブジェクトの配列book_listがあるとします。
book_list内のBookオブジェクトをscoreの高い順に並び替えたいのですが、
自分で考える限り、以下のような感じで力尽きます。

sorted_book_list = []
book_list.each do |b|
sorted_book_list.each_with_index do |sb, i|
if b.score > sb.score
# i番以降の要素を全て一つ後ろにずらす処理がここで必要だが実現できたとしてもパフォーマンスが酷そう。
sorted_book_list[i] = b
break
end
end
end

もっとスマートな方法があれば教えて頂けないでしょうか。
0446デフォルトの名無しさん2011/03/11(金) 15:00:13.72
sorted_book_list = book_list.sort {|a, b| a.score <=> b.score }
0447デフォルトの名無しさん2011/03/11(金) 15:34:37.78
Perlだとハッシュテーブルの配列の大きさを

keys %hash = 64;

と指定できるのですが、Rubyにもそういう機能はありますでしょうか?
0448デフォルトの名無しさん2011/03/11(金) 15:37:39.50
>>445
book_list.sort_by {|book| book.score }

>>447
残念ながらない
0449デフォルトの名無しさん2011/03/11(金) 15:48:19.11
>>448
ないですか。
�d
04504452011/03/11(金) 23:34:16.09
>>446
>>448
ありがとうございます!
まさに求めていた機能です。勉強になりました。
0451デフォルトの名無しさん2011/03/15(火) 11:20:01.58
>>444
GoFなデザインパターンは、Rubyみたいな後発で動的で完全オブジェクトで
プロックとブロックが跋扈してるような言語ではあまり新鮮な有り難味がないかも
「あーこれ名前ついてたんだー」とか思うことがしばしばある
0452デフォルトの名無しさん2011/03/15(火) 18:10:19.84
ちょっとjavascriptに浮気してくる。
ウェブサイトに必須のようだから。
0453デフォルトの名無しさん2011/03/17(木) 20:02:07.00
0から99までの数字の配列が欲しいのですが、

i = [0..100]
puts i

とやっても期待した結果が得られません。
(実行結果=[0..100])
配列をバラバラにして取得するにはどうすればいいでしょうか?
0454デフォルトの名無しさん2011/03/17(木) 20:06:49.06
(0..100).to_a
0455デフォルトの名無しさん2011/03/17(木) 21:05:24.01
0..100 だと 0, 1, 2, ..., 98, 99, 100 になる。
末尾を含まないRangeは 0...100 (ドット3つ)
0456デフォルトの名無しさん2011/03/17(木) 21:40:39.05
>>453
(0..99).to_a だな
Range クラスというのがある
開始と終了と succ メソッドの返り値(と比較メソッド)だけ見てる変なクラスだ
0457デフォルトの名無しさん2011/03/17(木) 21:44:20.33
to_a する方法はいろいろあるけど、元のコードに一番近いのは
それよりもこれじゃないかと思った。

[*0..99]
0458デフォルトの名無しさん2011/03/17(木) 23:00:58.58
[*0...100]
0459デフォルトの名無しさん2011/03/18(金) 00:55:26.51
あんまり話題としては取りざたされないけど
Rangeクラスって、Rubyの特徴的な機能の一つだよね

これも何かほかの言語にあった機能を、Rubyが取り込んだものなんだろうか
0460デフォルトの名無しさん2011/03/18(金) 01:05:24.55
状態を持つ演算子としての .. (...) は Perl 由来。
その状態をRuby以前にオブジェクト化したものがあるかは生憎知らない。
0461デフォルトの名無しさん2011/03/18(金) 10:05:59.40
>>453
>i = [0..100]
>puts i
これは
r = 0..100
i = [r]
と同じである、つまり
・「0..100」というRangeオブジェクトが1つだけ入った配列
になる。
0から99までの配列の作り方は>>454以降を参照。
0462デフォルトの名無しさん2011/03/18(金) 16:10:31.92
Perlだと範囲演算子はリストに展開するからRubyも同様と思ったのかも
0463デフォルトの名無しさん2011/03/18(金) 18:36:28.23
何をするかにもよるが、Rubyの場合Rangeのまま使っちゃうのもアリ
Rangeもイテレータ呼んだり出来るからね
0464デフォルトの名無しさん2011/03/18(金) 18:59:06.05
0..9.to_a

って書けるようになったんだっけ?
1.9で演算子?の優先順位が変わったとか。
代わってないか。
0465デフォルトの名無しさん2011/03/18(金) 19:01:44.69
変わってないからみんな括弧つけてるじゃん。
0466デフォルトの名無しさん2011/03/18(金) 20:17:55.76
有理数のリテラル
0467デフォルトの名無しさん2011/03/18(金) 22:18:53.23
> [*0..99]
これどういう意味?
0468デフォルトの名無しさん2011/03/18(金) 22:51:01.34
範囲オブジェクトをリストに展開
0469デフォルトの名無しさん2011/03/18(金) 23:04:00.96
to_aしてから展開する
[*1..3] == [1,2,3]

マニュアル見たら [*obj] の説明は無かったが
メソッド呼び出しの最後の引数に*をつけると、配列を展開して渡せる
それと同じことが 配列リテラルでもできる
[0,1,2,*7..9] == [0,1,2,7,8,9]

Ruby 1.9からは、ちょっと拡張されて
最後の引数だけじゃなくてどこでもよくなって、複数でも可能に
[*1..3,5,*7..9] == [1,2,3,5,7,8,9]
0470デフォルトの名無しさん2011/03/18(金) 23:47:42.59
一時期 to_splat というメソッド名があったのだが、今はないようだ。
0471デフォルトの名無しさん2011/03/19(土) 03:34:32.77
>ruby -E utf-16le -e "$stdin.binmode"
-e: ASCII incompatible encoding needs binmode (ArgumentError)
どうすれば?
0472デフォルトの名無しさん2011/03/19(土) 08:14:35.15
それあれだよね、中身としては binmode 以前の

$ ruby -E utf-16le -e ""
-e: ASCII incompatible encoding needs binmode (ArgumentError)

> ruby -E utf-16le -e ""
<internal:prelude>:3:in `require': incompatible character encodings: Windows-31J
and UTF-16LE (Encoding::CompatibilityError)

とか出るのをどうすればいいかという話だよね
0473デフォルトの名無しさん2011/03/19(土) 14:10:46.54
>>468-469
質問した人じゃないけど、すごくわかりやすいです。
横から�d
0474デフォルトの名無しさん2011/03/19(土) 14:44:21.99
まったくのRuby初心者ですが
Windowsユーザーの方に質問です
みなさんはどのような環境でプログラミングされていますか?
RDEやEclipse、NetBeans等いろいろあるので
どれを選択すべきか悩んでいます
意見を頂けないでしょうか?
0475デフォルトの名無しさん2011/03/19(土) 14:51:00.17
>>474
基本はVirtualBox上にLinux入れて、自前コンパイルをインストールした環境。
パッケージングシステムとgemの相性が悪いので…

んで、Windows上で使うものの時にはNetBeans + JRubyで。
rawrでexe化が出来るので…。Macのappも作れるよ。
0476デフォルトの名無しさん2011/03/19(土) 15:59:44.25
基本的にはエディタとコマンドプロンプトだと思うの
IDEがない時代に考えられた言語で、スクリプト単体で動作するように作られてるから

標準入力と標準出力をきちんと把握したあとで
(悲しいけどこれ最重要、IDEべったりの人はここで詰まる)
IDEがサックサクの環境ならEclipseでいいんでないかね
NetBeansが次点人気
RDEはとりあえず初心者は捨てていい

あと、Javaや.netのような親切で高度で指一本な連携サポートはできないのでご注意
0477デフォルトの名無しさん2011/03/19(土) 16:07:19.44
RubyをIDEで始めてしまうと、実際のスクリプトの実行方法がよくわからないことになるからな…
IDE上からは実行できるんですが普通に使う方法がわかりませんというのはFAQに近い
エディタとコマンドプロンプトで作って、ある程度納得してから進む道決めたほうがいいかもしれん

うまい教科書があるといいんだけど
0478デフォルトの名無しさん2011/03/19(土) 16:10:44.33
その手の根性主義はもう流行らないと思う
0479デフォルトの名無しさん2011/03/19(土) 16:15:33.40
だって、IDEのRubyサポートって初心者に全然優しくないもの
あんなものを最初に触らせること自体「俺ならできる、だからお前もやれ!」という体育会系の思考だわ
0480デフォルトの名無しさん2011/03/19(土) 16:24:47.12
あれはJavaとかC++とかでEclipseやNetBeansを使い慣れている人が
Rubyでも似たようなことをしたいと思って使うもんだ

Ruby初心者には若干厳しく、統合開発環境初心者には鬼だ
そのへん見極めて勧めないと逆効果になりかねん
0481デフォルトの名無しさん2011/03/19(土) 16:36:06.27
意見を下さった方、ありがとうございました
■ このスレッドは過去ログ倉庫に格納されています