[表示 : 全て 最新50 1-99 2chのread.cgiへ]
Update time : 05/10 01:15 / Filesize : 23 KB / Number-of Response : 77
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

Ruby 初心者スレッド Part 20



1 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:35:19 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

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

32 名前:デフォルトの名無しさん [2008/07/01(火) 02:02:30 ]
>>30
あなたのお使いのOSがサポート切られたら同じことが言えますか?

33 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 02:13:27 ]
まあどちらにしてもRubyは関係ないな
Vistaプログラミングの解説でも読むといい

34 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 04:31:21 ]
% ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]

% cat a.rb
1.upto(10){|i|
if i%2==1
s="aaa"
else
s=s+"bbb"
end
}

% ruby a.rb
a.rb:5: undefined method `+' for nil:NilClass (NoMethodError)
from a.rb:1:in `upto'
from a.rb:1

何故エラーになるのか、判る人いますか?

35 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 05:18:34 ]
>>34
i が 1 の時(ループの最初回)、未定義の変数 s の値は nil となる
つまり5行目の s=s+"bbb" は s=nil+"bbb" となり # s = nil.+("bbb")
nil に定義されていないメソッド + が呼び出された為に NoMethodError が発生した

36 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 05:21:41 ]
i=1のとき条件分岐はelse節に入って、s=s+"bbb"が評価される

ところが、この時点でsは未定義
たぶんsがString扱いになって、文字列連結されるのを期待していたんだろうけど
未定義のローカル変数はRubyではniになっちゃう

解決策。RubyにsがStringだってことを教えてやれば良い
s=String.newを書いておくとか

37 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 05:31:02 ]
いやいやw、i==1でifの条件は満たされるだろう。

1.upto(10){|i|
p i
if i%2==1
s="aaa"
p s
else
s=s+"bbb"
p s
end
}

で、とりあえず動きを見てみれ。
このコード全体の前に
s=""
と書いとけば、おそらく望みの挙動をする。

38 名前:36 mailto:sage [2008/07/01(火) 05:33:36 ]
あーダメだもう寝ようw

39 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 06:04:37 ]
>>32
状況も含めて導き出される結論に対して、
別の状況を設定して「この状況下でも同じなのか?」とか訊いても無意味。
しかもなんか、状況と共に変わる結論は偽の結論だとでも言いたげだし。馬鹿なの?

40 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 06:18:08 ]
質問スレで喧嘩すなw



41 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 06:41:38 ]
ちょっと前に本スレでも同じようなやりとりがあったよ
ttp://pc11.2ch.net/test/read.cgi/tech/1204466626/482

まずRubyはソースコードをパースしてパースツリーを得る
パースツリーを解釈していく段階で代入文が見つかったら
それをRubyは変数の宣言なり定義と解釈する

>>34のコードでは、変数の宣言は代入文で静的に行われている
しかし(実行時に行われる動的な)初期化が行われていないのでsの値はnilになる

ということだろうと思うんだけど間違ってたら指摘してね

42 名前:25 mailto:sage [2008/07/01(火) 07:55:59 ]
その後、解決できました。

このライブラリ(Ruby/MySQL)はもともとMySQL5用で、
MySQL4.1にはパッチで対応されていました。
自宅Winではこのパッチをあてることで動作確認できたため、
そのままアップロードして使おうとしていたのですが、うまくいきませんでいした。

おしえていただいたリンク先の解説やパッチの内容などから、もしやと思い
パッチなしでアップしてみたところ、正常な動作を確認しました。

詳しい理由はあいかわらずわかりませんが、そんなことがあった、ということで一応・・・アセ

43 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:16:02 ]
>>34
% cat a.rb
1.upto(10) {|i|
if i % 2 == 1
s = i
else
p s
end
}
% ruby a.rb
nil
nil
nil
nil
nil

sがブロックの外側で定義されていないので、
sのスコープもエクステントもブロックの内側のみになる。

要するにブロックが実行されるごとに新しいsが作られている。

44 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:27:29 ]
>>37
先頭に s="" を入れたらエラーがなくなりました。
それにしても、i=1でs="aaa"としているのに、次の
i=2でsがnilになってしまう理由が判りません。
pythonで同様の実行するとOKなのでますます不可解。

for i in range(1,10):
  if i%2 == 1:
    s="aaa"
  else:
    s=s+"bbb"


45 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:37:04 ]
>>44
>>43


46 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:37:53 ]
>>43,45
ありがとうございます。 状況が理解できました。

47 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:41:04 ]
for を使うとスコープが変わるのが不思議なところ

% cat a.rb
for i in 1..10
if i % 2 == 1
s = i
else
p s
end
end

% ruby a.rb
1
3
5
7
9


48 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:42:50 ]
全然不思議じゃないっしょ
Cなんかと一緒で{}内でスコーピングが閉じるだけ。
{
s = "hogehoge
}

このあとでsが参照されたらそりゃnilが返るっしょ

49 名前:34 mailto:sage [2008/07/01(火) 08:50:15 ]
ふと疑問になったのですが、ブロック内の変数が毎回作られるかどうか
という挙動が、外部要因(ブロック内外で同じ変数名があるか)で変わって
くるとすると、ブロック外の変数をうっかり削除するとバグ要因になってしまう・・・・?

50 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 09:02:54 ]
そうだよ
だから「えす」とか「あい」とか「てぃーえむぴー」とか
てきとうなへんすうめいはつかわないほうがいいね
これがわからないならるびーみたいなじょうきゅうしゃようのげんごじゃなくて
ぶいびーとかしょきゅうしゃようのげんごをつかうといいよ




51 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 09:16:49 ]
>>49
基本的にブロック内の変数はブロックで閉じ込められると思えばよろし。
外部に同じ名前があったらそちらを参照するだけ。
わりとわかりやすいから問題になることはない。

ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
1.9からはブロック変数もブロックローカルになった。


52 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 09:26:47 ]
変数有効区間が壁で区切られてるような2次元的イメージをするとRubyの動作は極悪に感じる
トップレベルという台にイテレータとかの各ブロックが乗っかってるような3次元的イメージをするとよい

53 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 09:30:02 ]
>>51,52
ありがとうございます。 なるほど、そう割り切ればすっきりしますね。
実は、ブロック内の変数が毎回作られる、というのはクロージャの作り方と
関係あるんだろうか?と思案していましたので。

> ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
> 1.9からはブロック変数もブロックローカルになった。
以下の結果が1.8と1.9とで違うと解釈しました。
今まで副作用のバグで苦しむことが多かったので、1.9の方が素直に理解出来そうです。

i=100
1.upto(10){|i|
p i
}
p i

54 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 09:47:07 ]
というか、スコープを作るためだけに while true をしなくても loop でよくなったって話では

55 名前:デフォルトの名無しさん [2008/07/01(火) 20:37:54 ]
Rubyの中から、自分が現在使用しているメモリーの量を知るにはどうしたらいいですか?

56 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 21:22:32 ]
特にない

57 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 22:09:37 ]
プラットフォーム非依存の方法はないな。

Linuxで File.read("/proc/#{$$}/statm").split.first.to_i とかできそうだし、
他の環境でもなんかあるんじゃない?



58 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:20:49 ]
え・・・
自プロセスのサイズを知るのにそんな回りくどい方法をしないといけないんですか?
PHPですら、memory_get_usageで簡単に知ることができるのに・・

59 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:23:12 ]
PHPじゃないから


60 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:37:18 ]
Perlにもなかったよな
なんでPHPにはあるんだろうね




61 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:40:35 ]
Pythonだと
resource.getrusage(resource.RUSAGE_SELF) あたりだなぁ。


62 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:41:24 ]
え、「使用しているメモリ量」って言ったじゃん

63 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:41:42 ]
PHPで言う所の$foo->$bar($baz)はどうすればいいのでしょうか

eval "foo.#{bar}(baz)"とする以外に方法が思い付かなかったのですが
もっと良い方法はありませんか?

64 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:49:24 ]
プロセスのサイズとプロセスが使用しているメモリ量っておなじもの?


65 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:50:56 ]
PHPの文法よーしらんが
$fooが変数、$barがメソッド名、$bazが引数ってことかいな。

foo.__send__(bar, baz)

__send__はsendでもいい



66 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:51:20 ]
s/変数/オブジェクト/


67 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:01:05 ]
perlはCPANからProc::ProcessTableをインストールして
(grep { $_->pid == $$ } @{Proc::ProcessTable->new->table})[0]->size


68 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:11:38 ]
>>65
なるほど、__send__を使うんですね!ありがとう!

>$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
その通りです、舌足らずでごめんなさい><

69 名前:デフォルトの名無しさん [2008/07/02(水) 01:11:14 ]
FastCGI+Rubyでwebプログラム作り始めました。
これRubyのプロセスがずっと居座って、foreachで回ってるんですよね。
以前、Rubyはずっと居座っていると使用メモリが肥大化していくということを
どこかで読んだ記憶があるのですが、
こういった問題に対してどのような解決法をとるのが普通なのでしょうか?

70 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 01:34:15 ]
定期的にプロセスを再起動するのが手っ取り早い。

Rubyで書いたXMLRPCを話すdaemonとか稼動させてたけど、
別にプロセスは肥大化しなかったな。
プログラムの書き方によるんでない。



71 名前:デフォルトの名無しさん [2008/07/02(水) 02:29:28 ]
Rubyでは、クラス記述の冒頭で、インスタンス変数の宣言はしないんですか?
使用しているインスタンス変数がわかりやすいので
あった方がいいのではないかとも思うのですが
本に載ってるサンプルには書いてありません

72 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:31:25 ]
クラス記述の冒頭にinitializeを置いてそこで初期化せよ、と
教祖の本に書いてある。

73 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:36:07 ]
確かに、initializeに書いておけばわかりやすいですね
ありがとうございました

74 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:44:12 ]
>>71 に便乗。

私も使い始めですが、確かに一覧性が無いと思いました。
クラスの記述で、インスタンス変数を初期化する処理は、initialize等のメソッド内に書くしか
無いのでしょうか。

75 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:50:30 ]
外部に名前を見せても構わない場合は、
attr_reader :size (外部から読み取り専用の場合)
attr_accessor :name(読み書き両方)
のようなクラスメソッドを使うと、@size、@nameなどのインスタンス変数が
使えるようになり、size, name, name=などのメソッドで参照や設定ができる
ようになる。

完全非公開の属性で、name=とか定義する必要がないなら、どこかのインスタ
ンスメソッド(代表的なのがinitialize)で使うことで定義される。


76 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:55:27 ]
未初期化のインスタンス変数にはnilが入ってるから
@hoge||=1
とかで初期化されてないときだけ初期化することは可能






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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