トップページ⇒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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0002デフォルトの名無しさん2011/02/10(木) 13:48:19
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/gp/product/4797357401/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
 ・「初めてのRuby」
  http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
 ・「Rubyレシピブック 第3版 303の技」(初心者向け、1.9対応)
  http://www.amazon.co.jp/dp/4797359986/
 ・「プログラミングRuby 第2版 言語編」(初心者向け参考書)
  http://www.amazon.co.jp/dp/4274066428/
 ・「Ruby Way 第2版」(脱初心者向け)
  http://www.amazon.co.jp/dp/4798115339/
 ・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
  http://www.amazon.co.jp/dp/4873113245/

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  http://www.amazon.co.jp/dp/4873113946/

0003デフォルトの名無しさん2011/02/10(木) 13:48:40
Ruby 公式・非公式便利サイト2009

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
 http://www.ruby-lang.org/ja/man/
 http://www.ruby-doc.org/ 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
 http://elbereth-hp.hp.infoseek.co.jp/ruby.html
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/

0004デフォルトの名無しさん2011/02/10(木) 13:51:02
●関連スレ
Rubyについて Part 42
http://hibari.2ch.net/test/read.cgi/tech/1295081752/
●Railsスレ
【RoR】Ruby on Rails Part11
http://hibari.2ch.net/test/read.cgi/php/1292032736/
●アンチスレ
Rubyについて(アンチ専用) Part004
http://pc12.2ch.net/test/read.cgi/tech/1249737531/
●Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

●前スレ
Ruby 初心者スレッド Part 40
http://hibari.2ch.net/test/read.cgi/tech/1292049975/
Ruby 初心者スレッド Part 39
http://hibari.2ch.net/test/read.cgi/tech/1287623173/
Ruby 初心者スレッド Part 38
http://hibari.2ch.net/test/read.cgi/tech/1282781922/
Ruby 初心者スレッド Part 37
http://hibari.2ch.net/test/read.cgi/tech/1274121477/

0005デフォルトの名無しさん2011/02/10(木) 13:51:37
【バージョンに関するよくある流れ】

Ruby 1.8.5(非安定板)→ Ruby 1.8.6(旧安定版、長期政権)→ Ruby 1.8.7(超お勧め)
Ruby 1.9.0(旧開発版)→ Ruby 1.9.1(旧1.9系列安定版)→ Ruby 1.9.2(1.9系最新安定版)

実のところ、よくできた教科書またはトラブル時に聞き倒せる師匠がいるなら 1.9.2 から入っても特に問題はない
1.9.2ユーザーの場合は「1.9.2使ってます」と断った上で質問してほしい由

【Windows版に関するよくある疑問】

初心者の人はとりあえず ActiveScriptRuby の 1.8.7 使っておけば間違いない(mswin32)
ttp://www.artonx.org/data/asr/
の題字のでかい 「ActiveScriptRuby 1.8.7(pなんとか) with-winsock2 tcl-stub」

マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/
の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」

夢のお告げ等、何かの間違いで Ruby の知識がない初心者時代から 1.9.2 を使いたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.2-p数字 Microsoft Installter Package」

「Windows版Ruby」として紹介されることのある以下の「RubyInstaller」は
これ特有のトラブルの修復知識が必要なので今のところは初心者には勧めない(mingw32)
ttp://rubyinstaller.org/
このトラブルを回避できるようになったら初級者脱出かも

0006デフォルトの名無しさん2011/02/10(木) 22:04:40
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
0007デフォルトの名無しさん2011/02/11(金) 09:42:30
スレたて乙
0008デフォルトの名無しさん2011/02/12(土) 17:56:10
プログラムの結果を出力する際は
基本的にはputsとprintとprintfを使い分ければいいのかな?
改行したいときはputsで
したくない時はprint
フォーマットしたい時はprintf
という感じでOKですか?
0009デフォルトの名無しさん2011/02/12(土) 18:28:34
p
0010デフォルトの名無しさん2011/02/12(土) 18:29:58
>>8
機能の違いを分かってればどれでもいいよ
0011デフォルトの名無しさん2011/02/12(土) 19:19:26
基本的にはputsしまくりだが、表示後の改行を確実に厳密にしたい場合はprintを使う
オブジェクトの内容を人間にわかりやすく表示するデバッグ用途ならp
いわゆるsprintフォーマットを使用したい場合は%やsprintfの結果をputsするのが多数派
標準エラー出力に表示するwarnというのもあるが誰も使ってない
$stderr.puts "error!" とか書く
001282011/02/12(土) 20:12:57
ありがとうございます!
pの存在を忘れてました。
そしてprintfの中に改行文字入れるよりputs sprintfなのか。なるほど。。
0013デフォルトの名無しさん2011/02/13(日) 09:15:09
puts "%x %d" % [10, 0xF]
とかもあるよね。
0014デフォルトの名無しさん2011/02/15(火) 17:00:55
>>11
そういや俺も warn の存在は知ってるけど何故かいつも $stderr.puts だな。
なんでみんな使わないんだろ?
「warn」だと字面的に目立たないからかなあ?
0015デフォルトの名無しさん2011/02/15(火) 17:26:09
warnが組み込みライブラリに入ったのって1.8に入ってからじゃないっけ
それ以前はstderr使うしか無かったと思うから、それでじゃね?
0016デフォルトの名無しさん2011/02/15(火) 19:00:52
warn知らなかった
0017デフォルトの名無しさん2011/02/15(火) 21:47:06
warnなんてあったのかw
宣伝不足じゃね?
0018デフォルトの名無しさん2011/02/15(火) 22:05:04
warn「うわ〜んT-T」
0019デフォルトの名無しさん2011/02/16(水) 03:54:19
warnなんてperlとの互換のために放置されてるだけで非推奨
0020デフォルトの名無しさん2011/02/16(水) 04:49:34
perlとの互換??
0021デフォルトの名無しさん2011/02/16(水) 12:01:25
さあ・・・
0022デフォルトの名無しさん2011/02/16(水) 13:26:38
>>19
非推奨kwsk
0023デフォルトの名無しさん2011/02/17(木) 00:37:36
なんで
(1..5).each(&method(:puts))
が
(1..5).each { |num| puts num }
になるの?
0024デフォルトの名無しさん2011/02/17(木) 01:20:01
それはもうそういうもんだとおもっていただくのがいちばんよろしいかと思われます
すぱぁと明確に説明できる人は今のところ現れておりませぬ
inject みたいにわかりやすい変形ができるならよかったのですが
0025デフォルトの名無しさん2011/02/17(木) 01:27:23
マクロとかテンプレートのノリだと思えばいいんじゃないか
というかそういう変形が出来ると初めて知ったのですが
0026デフォルトの名無しさん2011/02/17(木) 01:36:50
そうですか
(1..5).map(&(1.method(:+)))
=> [2, 3, 4, 5, 6]
おおっ、できました
それではなんとなく分かった気分になっておきます
0027デフォルトの名無しさん2011/02/17(木) 01:38:23
>>23
>(1..5).each(&method(:puts))
これは
proc_obj = method(:puts).to_proc()
(1..5).each(&proc_obj)
とおなじ。
そしてこれは
proc_obj = Proc {|x| puts x }
(1..5).each(&proc_obj)
とおなじ。
そしてこれは
(1..5).each {|x| puts x}
とおなじ。


てきとーに書いてみたので、まちがってたらごめん。
0028デフォルトの名無しさん2011/02/17(木) 01:53:25
proc_obj = method(:puts).to_proc()
から
proc_obj = Proc {|x| puts x }
を詳しく
0029デフォルトの名無しさん2011/02/17(木) 01:56:47
うむ
というか、それ以外は既に何度も出てきてる
0030デフォルトの名無しさん2011/02/17(木) 02:02:55
1.8だとクラスの特異クラスのスーパークラスはClassクラスの特異クラスなのに1.9だとクラスの特異クラスのスーパークラスはクラスのスーパークラスの特異クラスなんだね〜。
なんで仕様が変わったのかな?
0031デフォルトの名無しさん2011/02/17(木) 09:41:32
method(:puts)ってのはself.method(:puts)と同じ。
つまりself.putsをeachに渡してるわけだけど
このself.putsってのは大抵はKernel.putsのこと。
なので(1..5).each { |num| Kernel.puts num }と同じ意味になるって感じかなぁ…?
0032デフォルトの名無しさん2011/02/17(木) 10:01:45
>>27
>>(1..5).each(&method(:puts))
>これは
>proc_obj = method(:puts).to_proc()
>(1..5).each(&proc_obj)
>とおなじ。

to_proc()をつけなくても表面上の動作は変わらないのですが、>>27さんの例示では何故
to_proc()をつけているのでしょうか?

proc_obj = method(:puts)
(1..5).each(&proc_obj)

to_proc()をつけるつけないで意味合いが違うのでしょうか?
0033デフォルトの名無しさん2011/02/17(木) 10:14:16
http://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
これに書いてあるように&を付ける引数にはto_procを持つオブジェクトを渡すことができて
実はその時にto_procを呼んでprocオブジェクトに変換していますよーって話
>>27 は分かりやすいようにそれを明示してるだけだね
0034デフォルトの名無しさん2011/02/17(木) 10:20:28
>>32
動作に違いがないのはその通り。同じことを分かりやすく書いただけだから。
33が説明してくれてるけど、&proc_objとすると、暗黙的にproc_obj.to_proc()が呼ばれる。
それだと初心者にはわかりづらいだろうから、明示的に .to_proc() を呼びだしているだけ。
0035デフォルトの名無しさん2011/02/17(木) 10:48:11
Rubyは
if () {
〜
}

みたいに括弧で書く方法は用意されてないのでしょうか?
basicみたいにendなど使うのに違和感があります
0036デフォルトの名無しさん2011/02/17(木) 10:59:20
>>33-34
なるほど、そういうことですか。
&をつけると、暗黙的にto_proc()が呼ばれるんですね。
0037デフォルトの名無しさん2011/02/17(木) 11:16:19
>>35
ない
if はブロック構造ではないので { } で代用することはできない
まあ、実際問題としてすぐ慣れる
0038デフォルトの名無しさん2011/02/17(木) 12:09:29
>>35
最初は気持ち悪いかもしれません。それは仕方ないです。
でもすぐに慣れると思います。Lispだと慣れない可能性大ですが、Ruby程度なら十分慣れます。
0039デフォルトの名無しさん2011/02/17(木) 12:32:37
これって作者の趣味でそうなったの?
0040デフォルトの名無しさん2011/02/17(木) 13:35:01
>>39
このへんは初期構造を引き継いでるので、本人の趣味と断じてしまえばまあ、そうなんだが、
Ruby では { } は
 ・ Hash リテラル {'one' => 1, :two => 2}
 ・ スコープを作るブロック構文 arr.each{|x| puts x}
 ・ リテラル中の埋め込み "#{mes}"
に既に使用されてて若干構文解析負荷が高い
それに加えて「スコープを作らない if かもしれないヨ〜」というのを付け加えるのはさすがにちょっと、
というようなのがあったんじゃないかなーと外野推測
0041デフォルトの名無しさん2011/02/17(木) 16:57:54
to_procの話題なら前スレでも出てるのに
0042デフォルトの名無しさん2011/02/17(木) 17:35:15
Ruby覚えたてのころよくやった遊び

def IF(bool)
if bool then yield end
end

IF(true){puts 'true!'}

elseは綺麗にかけない
0043デフォルトの名無しさん2011/02/17(木) 17:47:44
def THEN(&blk) blk end
def ELSE(&blk) blk end
def IF(bool,tblk=nil, fblk=nil)
if bool
if tblk.respond_to?(:call)
if block_given?
raise
else
tblk.call
end
elsif block_given?
yield
end
elsif fblk.respond_to?(:call)
fblk.call
end
end

IF(true){puts 'true'}
IF (true),THEN{puts 'true'},ELSE{puts 'false'}
IF (false),THEN{puts 'true'},ELSE{puts 'false'}

IF直後の空白重要
なんか、ぶさいく

0044デフォルトの名無しさん2011/02/17(木) 18:00:58
>>41
"結論"は出てない
0045デフォルトの名無しさん2011/02/17(木) 18:37:17
>>23は普段使わない機能の複合なのでめんどくさいのだよな
そもそも>>33のいうように、mes(&pr) とすると mes{|x| ...} の {|x| ...} 部分を
proc オブジェクトとして「分離して」おいて代入することができる

['a', 'b', 'c'].each{|x| puts x.upcase} #=> A B C
pr = proc{|x| puts x.upcase}
pr.call('yes!') #=> "YES!" # proc のいちばん一般的な使いかた
['a', 'b', 'c'].each(&pr) #=> A B C

> to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます
> (デフォルトで Proc、Method オブジェクトは共に to_proc メソッドを持ちます)。
ということで、内部的には to_proc メソッドが呼ばれて「ブロックが復元」されてるらしい

場面転換

method という関数的メソッドがあり、これは Object#method を呼ぶ
Object#method(name) は self の name というメソッドをレシーバとの関係ごと固定化してオブジェクトとして返す

m = Kernel.method(:puts)
m.call('message!') #=> "message!"

Method#call(args) という、proc とまったく同じ書き方(ここ最重要)で時間差起動することができる
で、これらを踏まえると

(1..5).each(&method(:puts)) は
(1..5).each(&putsメソッドのMethodオブジェクト)
(1..5).each(&呼ばれたときの引数をputsに渡すprocオブジェクトのようなもの)
(1..5).each(& proc{|x| puts x})
(1..5).each{|x| puts x}

となる
でどうよ
0046デフォルトの名無しさん2011/02/17(木) 19:18:39
いやそこじゃなくてレシーバや引数がどう決まるかがよく分からないんだ
&:foo
1引数のとき {|x| x.foo }
2引数のとき {|x, y| x.foo y}

&method(:foo)
{|x| self.foo x}
0047デフォルトの名無しさん2011/02/17(木) 21:03:53
今日始めた初心者です.

a = [ 1, 2, 3, 4 ]
a.inject {|a, b| a + b}
=>10

の後,

a
=>6

となるのが納得できません.

仕様書のどの辺に書いてあるか教えてください.
0048デフォルトの名無しさん2011/02/17(木) 21:12:14
読んで理解するような仕様書とかはないんだが、Ruby ではブロック引数は被ると考えてもらっていい
被らないバージョンのRubyも存在するが、互換性の問題でこれに頼った記述は全く勧められないので忘れてくれ

a.inject{|x, y| x + y}

とか書くのが一応回答
0049デフォルトの名無しさん2011/02/17(木) 21:15:50
>互換性の問題でこれに頼った記述は全く勧められない
そうなんだよなあ…
何がめんどくさいって、ここが問題で1.8ではうまく動作しないということを見つけるまでが果てしなくめんどくさい
0050デフォルトの名無しさん2011/02/17(木) 22:01:07
>>47
「a」.inject {|「a」, b| 「a」 + b}
上のaは全部同じオブジェクトなのでループしたときにaが上書きされる
0051デフォルトの名無しさん2011/02/17(木) 22:04:25
>>46
&:foo と &method(:foo)は見た目似ているけど
仕組みは全然違うから混同しちゃダメ。

後者はあくまでもself.method(:foo)のことで
self.foo をMethod Objectとして取り出しているので
{|x| self.foo x}と同じ意味になる。

&:foo の方はSymbol#to_procによってProc Objectに変換されるので
実際には :foo.to_proc がブロックとして渡されてる。
Symbol#to_procってのは
class Symbol
  def to_proc
    proc{|obj, *args| obj.send(self, *args)}
  end
end
な感じの定義なわけでつまり:foo.to_procは
proc{|obj, *args| obj.send(:foo, *args)}
ちょっと書き換えると
proc{|obj, *args| obj.foo(*args)}
となる。 つまり1つ目の引数のメソッドfooに残りの引数を引き渡す感じ
{|x| x.foo }とか {|x, y| x.foo y }と同じ動作になる
0052デフォルトの名無しさん2011/02/17(木) 22:32:50
OK, 理解した。ありがとう
&method(:foo)のほうは{|*args| self.foo *args}かな

しかし↓この説明でそこまで分かる人いるのか?
Symbol#to_proc -> Proc
self に対応する Proc オブジェクトを返します。

(1..3).collect(&:to_s) #=> ["1", "2", "3"]
(1..3).inject(&:+) #=> 6

0053デフォルトの名無しさん2011/02/18(金) 00:15:26
>Ruby ではブロック引数は被ると考えてもらっていい
1.9からは被らずにちゃんと遮蔽するよ
ついでに実験的仕様でブロックローカル変数を作れるようにもなった
a,b = :a,:b
[:foo].each do |a;b| # ;の後ろにブロックローカル変数を宣言できるぞ
b=:bar
p [a,b] #=> [:foo,:bar]
end
p [a,b] #=> [:a,:b]

1.8までは何でも書けたらしいね
a = [[:a,:b,:c]]
a.each{|a,$b,@c|}
p [a,$b,@c] #=> [:a,:b,:c]

>>50
ちょっとちがうんじゃね?
オブジェクトうんぬんじゃなくて、ローカル変数のスコープの話だと思うんだけど
0054デフォルトの名無しさん2011/02/18(金) 00:19:29
>>53
>互換性の問題でこれに頼った記述は全く勧められないので忘れてくれ
0055デフォルトの名無しさん2011/02/18(金) 00:35:39
ぐぇ〜,みんなありがとう.有名な話だったのね.

っていうか 1.8 が消え去るまで ruby やる気が失せた...

ありえないだろJK.
0056472011/02/18(金) 00:38:00
↑ 47 でした.
0057デフォルトの名無しさん2011/02/18(金) 01:31:00
Rubyではローカルスコープの外に同名の変数があるとそれへの参照となり
なければ新たな変数の定義となる(ただし1.9系のブロック引数は常に後者)

宣言無しで変数を使えますよ系言語の欠点

外側に同名の変数があっても新たな変数を定義できるような構文が欲しくなることがある
0058デフォルトの名無しさん2011/02/18(金) 02:05:13
というか広めのスコープに1文字変数使うやつってなんなの?
ブロック等の一番せまいスコープならまだ許せる
i、jは例外だと思うけど、それでもスコープ狭くするべき
テンポラリでないなら変数にちゃんとした名前つけろ
0059デフォルトの名無しさん2011/02/18(金) 02:09:22
なんなのっていうやつなんなの

以下スタック食いつぶすまで続く
0060デフォルトの名無しさん2011/02/18(金) 02:10:55
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1 [2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.
0061デフォルトの名無しさん2011/02/18(金) 02:25:35
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.
0062デフォルトの名無しさん2011/02/18(金) 02:59:54
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.
0063デフォルトの名無しさん2011/02/18(金) 03:02:40
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.
0064デフォルトの名無しさん2011/02/18(金) 03:20:10
もしブロックローカルな変数を他に使いたいときには,ブロック変数に変数宣言をセミコロンで追加すればいい.

x = 1
[2,3].each {|y;x| x = y }

こうすると x は 1 のままになる.
0065デフォルトの名無しさん2011/02/18(金) 08:54:01
1.8のときは、自分でスタックに積んでた。

def local &block
local_vars = eval("local_variables", block)
name_of_vals_arr = "__local_vals"

loop do
break if local_vars.all?{|var| var != name_of_vals_arr }
name_of_vals_arr += "_"
end

eval("#{name_of_vals_arr} = [#{local_vars.join(',')}]", block)

yield

local_vars.each{|var| eval(var + " = #{name_of_vals_arr}.shift", block) }
end

i = 1
j = 2

puts "i = #{i}, j = #{j}" # => i = 1, j = 2

local do
i = "a"
j = "b"
puts "i = #{i}, j = #{j}" # => i = a, j = b
end

puts "i = #{i}, j = #{j}" # => i = 1, j = 2
0066デフォルトの名無しさん2011/02/18(金) 19:29:03
ファイルの先頭に追加書き込みってできるんでしょうか?
ファイルポインタを動かしても write を使うと後ろに書き込まれてしまいます。
よろしくお願いします。
0067デフォルトの名無しさん2011/02/18(金) 20:10:25
>>66
いわゆる挿入モードは一発ではできません、が回答だと思う…
そーゆーもんなので、どうしようもない

irb> File.open('a','w'){|f| f.puts "111\n222\n333\n444"}
irb> puts File.open('a'){|f| f.read}
111
222
333
444
irb> File.open('a','r+'){|f| body = f.read; f.rewind; f.puts "000\n#{body}"}
irb> puts File.open('a'){|f| f.read}
000
111
222
333
444
0068デフォルトの名無しさん2011/02/18(金) 20:35:31
Google Code Jam Japan 2011
http://code.google.com/codejam/japan

rubyでも参加できるらしいぞ。
0069デフォルトの名無しさん2011/02/18(金) 20:58:30
Rubyだと(処理性能的な意味で)力技で通せなさそうだな
0070デフォルトの名無しさん2011/02/19(土) 12:34:33
            end
          }
        end
      }
    end
  end
end
↑はちょっと大げさだけど混在が気持ち悪い。
みな賛同してますか
0071デフォルトの名無しさん2011/02/19(土) 12:35:55
皆さん、どうしてますか?
0072デフォルトの名無しさん2011/02/19(土) 12:52:13
基本{}はワンライナーで書くようにしてる
0073デフォルトの名無しさん2011/02/19(土) 15:20:15
>>70
あまり気にしてない

ちょっと慣れると、エンドという英単語を読んでるわけではない、という境地になる
ただのヨコ長のブロック終端記号だ
0074デフォルトの名無しさん2011/02/19(土) 15:43:09
>>70
>混在が気持ち悪い。
混在は気にしないかな。end自体は気にするけど。
0075デフォルトの名無しさん2011/02/19(土) 17:58:52
ブレースが見た目に浮くことを利用して
リソース管理や大域脱出のブロックはブレースを使って目立たせる
コーディングルールもあったはず
0076デフォルトの名無しさん2011/02/19(土) 23:28:37.73
ご意見ありがとうございました
参考にさせていただきます
0077デフォルトの名無しさん2011/02/20(日) 07:25:41.22
Windows上でファイルをRubyのプログラムに
ドラグ&ドロップしたときの実行パスを取得するには、どうすればいいのでしょうか?
よろしくお願いします。

プログラムを通常実行したなら、File.expand_path(__FILE__)でパスが取れるのですが、
ドラグ&ドロップ時には、File.expand_path(__FILE__)の中身が、
  C:/Documents and Settings/ユーザー名/実行ファイル名.rb
となってしまいます。
0078デフォルトの名無しさん2011/02/20(日) 07:44:55.62
>>77
期待通りだけど何がマズイ?
0079デフォルトの名無しさん2011/02/20(日) 07:46:08.87
>>77
聞き方がおかしかった。どういう値になるのを期待している?

0080772011/02/20(日) 08:03:45.59
>>79
>聞き方がおかしかった。どういう値になるのを期待している?
c:\temp\program.exe
の上にファイルをドラッグしたら、c:\tempのパスが取得できることを期待しています。
(プログラム自体は、program.rbをexerbでprogram.exeに変換しています)

できれば「program.exeへのショートカット」上にドラッグしたとしても、
元のc:\temp\program.exeの実行パスを取得したいです。
0081デフォルトの名無しさん2011/02/20(日) 10:08:07.34
>>80
ttp://exerb.sourceforge.jp/man/doc/class.ja.html
0082772011/02/20(日) 14:52:00.80
>>81
ありがとうございます。とても助かりました。
0083デフォルトの名無しさん2011/02/20(日) 23:24:10.74
>>70
Python に乗り換えた
0084デフォルトの名無しさん2011/02/21(月) 08:00:25.78
Windows上で ruby 1.9.2 を使い、ファイル名がUNICODEで
ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの?
# coding:utf-8 と書くとファイルは開けるけど正規表現でエラー
# coding:Windows-31Jと書くとファイル名が文字化けして開けず
0085デフォルトの名無しさん2011/02/21(月) 08:09:36.27
文字エンコーディングの概念ない奴は1.8使えバーカバーカって煽られそうな内容だな
マジックコメントにはソースファイルの文字エンコーディングを記述する
openに渡すファイルパス名のStringオブジェクトの文字エンコーディングをUTF-8にして
マッチに使う正規表現の文字エンコーディングをWindows-31Jにすればよかんべ
Ruby1.9はぜんぶ別個にできるぞ
0086デフォルトの名無しさん2011/02/21(月) 08:50:12.61
あと、読み込むファイルのエンコーディングも
ばらばらに指定できるぞ。
0087デフォルトの名無しさん2011/02/21(月) 10:32:40.65
>>84
>ファイルの中身がWindows-31Jのテキストファイルで正規表現を使うにはどうしたら良いの?
こっちを優先して、コードはwindows-31jで書く。
ほんで、ファイル名を表す文字列はunicodeに変換してやる。
0088デフォルトの名無しさん2011/02/21(月) 10:49:29.19
おまい頭いいな
0089デフォルトの名無しさん2011/02/21(月) 14:13:01.98
Ruby初心者向け1.9文字エンコーディング教室とかサイト作ったら繁盛するかな
0090デフォルトの名無しさん2011/02/21(月) 15:09:28.21
絶対繁盛するからやってくれよ
0091デフォルトの名無しさん2011/02/21(月) 18:01:35.10
つーかファイル名をutf-8で直書きすれば普通に開けるのを今知った。M系APIだとばかり
ARGVはダメっぽい?
0092842011/02/21(月) 20:18:15.66
自己解決しました。自分も>>87の方法に行き着きました。

あと、Encoding.default_internal がよく分かりません。
指定しておくと読み込んだ内容がその文字コードに変換されるのかと思ったんですが……
0093デフォルトの名無しさん2011/02/22(火) 00:51:00.99
>>80
ちょっと遅レスだが
require 'Win32API'
rubypath = "\0"*2048
Win32API.new('kernel32', 'GetModuleFileName', %w(i p i), 'i').call(0,rubypath,rubypath.size)
rubypath.rstrip!
p rubypath
0094デフォルトの名無しさん2011/02/22(火) 13:37:28.41
rvm使ってる人は自分用CGI起動するRubyとかgemとかどうしてるの?
0095デフォルトの名無しさん2011/02/22(火) 15:59:04.40
>>89
むしろ、昔から使ってるひと向けに
0096デフォルトの名無しさん2011/02/22(火) 16:05:11.22
中学生が書いたパッチ見たけどさっぱりわからなかった。
0097デフォルトの名無しさん2011/02/22(火) 16:30:55.98
むしろ中学生が書くとプログラムという半定型文法文の何が変わるつもりだったのか>>96に聞いてみたい
0098デフォルトの名無しさん2011/02/22(火) 16:40:10.29
たわいもないレスにむきになりすぎだとおもいます。
0099デフォルトの名無しさん2011/02/22(火) 17:26:16.31
これか

リアル中2、Ruby最年少コミッタに就任【増田(@maskin)真樹】
http://techwave.jp/archives/51599766.html
0100デフォルトの名無しさん2011/02/22(火) 17:34:49.25
これはいいニュースだ。将来は第2代教皇だな
0101デフォルトの名無しさん2011/02/22(火) 19:34:27.07
スレッドについて初心者が学ぶのに最適な書籍はあるでしょうか
手元にあるたのしいRubyには全く載っていませんでした
■ このスレッドは過去ログ倉庫に格納されています