Ruby 初心者スレッド Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/12/11(土) 15:46:15★注意★ 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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0792デフォルトの名無しさん
2011/02/03(木) 10:23:03PHPは値渡しで、&をつけると参照渡し
じゃね?
0793デフォルトの名無しさん
2011/02/03(木) 10:29:36def foo(a, b)
a += 1
b += 2
end
x = 10
y = 20
foo(x, y)
p "x = #{x}" #=> 10 # 変更されてない
p "y = #{y}" #=> 20 # 変更されてない
c = x
d = y
c += 1
d += 2
p "x = #{x}" #=> 10 # 変更されてない
p "y = #{y}" #=> 20 # 変更されてない
p "c = #{c}" #=> 11 # 変更されてる
p "d = #{d}" #=> 22 # 変更されてる
0794デフォルトの名無しさん
2011/02/03(木) 10:59:51値渡し/参照渡しの回答をしている人が多いね。
質問への回答でなく単に値渡し/参照渡しの話をしたいだけかもしれないけど。
質問者の質問の仕方が悪いのと、引用したるびまの記事が値渡し/参照渡しについての説明
というのも影響しているんだろう。
0795デフォルトの名無しさん
2011/02/03(木) 11:11:06>PHPは値渡しで、&をつけると参照渡し
PHPは知らないが、Cの場合は全てが「値渡し(call by vale)」。
変数の前に単項演算子 & を付けると、その変数のアドレス値(ポインタ値)を得えることができるし、
それを関数の引数として渡すこともできる。(たとえば f(&x) など)
けれどその場合もアドレス値を「値渡し」しているのであって、
それを「参照渡し(call by reference)」とは言わない。
ただし、Cだけを語る文脈の中で、その「アドレス値の値渡し」のことを「ポインタ渡し」と呼ぶことがある。
C限定の文脈であれば、「ポインタ渡し」という用語は間違いではない。
でも、Cのポインタ渡しが「参照渡し」と混同して解釈されがちなのは事実で、注意して用いるべき。
繰り返すけど、これはCの場合。PHPは知らないよ。(同じかもしれないし、違うかもしれない)
0796デフォルトの名無しさん
2011/02/03(木) 11:35:40質問者への返答としては、>>791が FA(Final Answer) でいいんじゃないかと。
まとめると、Rubyの場合は、原始的(primitive)なオブジェクト(たとえばFixnum)は
即値(immediate value)であり、それらはメソッド呼び出しの際には値渡し(call by value)される。
その他のオブジェクト(たとえばArray)は即値ではなく、
メソッド呼び出しの際にはオブジェクトへの参照が渡される。つまり参照渡し(call by reference)される。
Cとは異なり、純粋OOPであるRuby(あるいは元祖であるSmalltalk)には、
アドレス(ポインタ)という概念がそもそも存在していないことに注意すべき。
C++やJavaのように、手続き型言語に後付けでOO機能を継ぎ足した言語は、
アドレスと(オブジェクトへの)参照が複雑に絡み合っているので、(厳密な意味論の)解釈は非常に難解なものになった。
ただし、だからといって、そんなC++/Java流の解釈をRubyに当てはめようとするのは無茶苦茶であるとしか言えない。
# 率直に言って、「Rubyはすべて値渡しである」と間違った自我流の解釈を押し付けようとする
# >>776,784のカキコ(同一人物?)は迷惑に感じる。(ぶっちゃければウザイの一言)
0797デフォルトの名無しさん
2011/02/03(木) 11:42:35>>796みたいなアホが出てくる事を予想して先回りしてたわけだな
0798デフォルトの名無しさん
2011/02/03(木) 11:55:460799デフォルトの名無しさん
2011/02/03(木) 12:03:530800デフォルトの名無しさん
2011/02/03(木) 12:42:11全然間違ってるよ。Ruby においては、
オブジェクトに原始的(primitive)かどうかなんて区別はない。
> Cとは異なり、純粋OOPであるRuby(あるいは元祖であるSmalltalk)には、
> アドレス(ポインタ)という概念がそもそも存在していないことに注意すべき。
んなことはない。むしろ Java より Ruby のほうが C の思想を引きずっていると思う。
むしろ >>769 あたりが FA なんじゃないかと。とはいえ >>794 の通りかも知れないけど。
0801796
2011/02/03(木) 13:03:36>んなことはない。むしろ Java より Ruby のほうが C の思想を引きずっていると思う。
その「JavaのほうがRubyよりもOOPらしい」というところをkwsk
全体的に、否定形の文体(.... ではない)に終止している感じがする。
XXXデハナイ(XXXは誤りである)で終えずに、YYYデアル、あるいはZZZデアルのほうが、前向きな議論ができると思う。
>>769のような(C++/Java流の)値渡しによる解釈はC++/Javaに慣れた人にとっては自然かもしれないけれど、
それをアドレス(ポインタ)という概念が存在しないRubyに当てはめようとする考え方そのものに無理がある、
というのが>>796の要旨。
自分としては、正直C++/Javaには詳しくないし、
>>791の解説を一からひっくり返してくれる解釈があれば、すごく嬉しかったりする。
0802800
2011/02/03(木) 13:19:33Java のほうがRubyよりOOPらしい、なんて一言も言ってないよ。
Ruby のほうが C の思想を引きずっていると書いた理由は、言語仕様ではないが、
Ruby のライブラリが C の関数と同じオプションを受け取れたりするところ。
(たとえば open() の第2引数(mode) とか、NKF とか)
PHP も Cの関数のラッパになっていることが多いが、Ruby も似ているので、
「これを呼ぶと C のあれが呼ばれるんだな」と感じることが多かったので、「C を引きずっている」と書いた。
「引きずっている」と書いているけど悪いと言っているわけではない。
> 全体的に否定形の文体・・・・
ここは私の力不足なところもあるが、
Ruby には、Java のような primitive 型とオブジェクトの区別がなく、すべてが
オブジェクトなのだから仕方がない。
そのオブジェクトが immutable かそうでないかというのはあるけど。
0803デフォルトの名無しさん
2011/02/03(木) 13:37:50自分もRubyを使うだけで、内部のことまで考えたことはないんだけど、、、
>>791でFixnum等が実装では即値扱いになっているのは、イミュータブルだから即値として扱っても
オブジェクトとしての性質が保たれるのと、パフォーマンスの問題もあるんではないだろうか?
例えば、Fixnumをオブジェクトとして実装するとGCの回収が必要となり、速度的な問題を生じるとか。
(即値だとGCがいらないかとか知らないけど)
他の実装はどうなんだろうか?
JRubyやIronRubyもCRubyと同じような実装なんだろうか?
>>791では即値でない実装があっても構わないと書いてあるし。
0804デフォルトの名無しさん
2011/02/03(木) 14:06:28ファイルオープンのモードはJavaでも引きずってなかったっけ?
最近は違うのかも知れんけど。
0805デフォルトの名無しさん
2011/02/03(木) 14:18:140806デフォルトの名無しさん
2011/02/03(木) 15:06:08「値渡し」「参照渡し」はプログラミング言語一般の引数の渡し方を説明するための用語であって
Ruby内の引数の渡し方を説明するためだけの用語ではない。
「Rubyに当てはめようとする……」という指摘がそもそも無理筋。
0807デフォルトの名無しさん
2011/02/03(木) 16:16:210808デフォルトの名無しさん
2011/02/03(木) 18:19:330809デフォルトの名無しさん
2011/02/03(木) 20:37:150810デフォルトの名無しさん
2011/02/03(木) 20:38:48ループする話も必要
0811デフォルトの名無しさん
2011/02/03(木) 21:44:36できればメジャーなやつで
あと参照の値渡しとRubyの値渡しは何が違う?
0812デフォルトの名無しさん
2011/02/03(木) 21:47:58> できればメジャーなやつで
C++
0813デフォルトの名無しさん
2011/02/03(木) 21:49:160814デフォルトの名無しさん
2011/02/03(木) 21:52:370815デフォルトの名無しさん
2011/02/03(木) 21:54:52$ cat ref.cpp
#include <stdio.h>
void foo(int &x) { x++; }
int main(void) { int a = 774; foo(a); printf("%d\n", a); return 0; }
$ gcc ref.cpp && ./a.out
775
参照渡しでは、仮引数 x が実引数 a の別名として機能する
0816デフォルトの名無しさん
2011/02/03(木) 21:59:22自分が知る範囲ではPerl,PHP,VB6,VB.NET/C#/C++はサポートしてる
VB6はデフォルトで参照渡し
C++/VBNET/C#はデフォルトが値渡しだが参照渡し用構文がある
Perlは参照渡しも値渡しも可能。
PHPも参照渡し可能。詳細忘れた
Cは直接サポートしてないが参照渡しのエミュレートは出来る
さっき初心者スレに書いたが元ネタはこのスレか
0817デフォルトの名無しさん
2011/02/03(木) 22:24:220818デフォルトの名無しさん
2011/02/03(木) 23:20:570819デフォルトの名無しさん
2011/02/03(木) 23:30:19参照渡しとごちゃ混ぜになるよりは相当マシ
0820デフォルトの名無しさん
2011/02/03(木) 23:36:42そういうのrubyでどう書くのか悩んだわ昔
0821デフォルトの名無しさん
2011/02/04(金) 00:34:59最初の質問である>>762を見る限りでは
値渡しと参照渡しについて質問してるとしか思えない
0822デフォルトの名無しさん
2011/02/04(金) 03:09:47あたかも値のようにしか見えない例と
あたかも参照のようにしか見えない例しか乗せてないし
class Fixnum; attr_accessor :a;end
def fn1(m); m = 456; end
def fn2(m); m.a = 456; end
def fa1(b); b = [4, 5, 6]; end
def fa2(b); b[0] = 0; end
n = 123
fn1(n) # 変更されない
p n # => 123
a = [1, 2, 3]
fa1(a) # 変更されない
p a # => [1, 2, 3]
n = 0
n.a = 123
fn2(n) # 変更される
p n.a # => 456
a = [1, 2, 3]
fa2(a) # 変更される
p a # => [0, 2, 3]
ってかFixnum普通(?)にインスタンス変数持てるんかいw
0823デフォルトの名無しさん
2011/02/04(金) 05:41:24変数がさすのはあくまでオブジェクト
n = 123
p n.object_id # => 247
fn1(n) # オブジェクトは変更されない
p n.object_id # => 247
a = [1, 2, 3]
p a.object_id # => 5839984
fa1(a) # オブジェクトは変更されない
p a.object_id # => 5839984
n = 0
n.a = 123
p n.object_id # => 1
fn2(n) # オブジェクトは変更されないが、その内部はメソッドコールによって変更される( Fixnum#a= メソッドによって )
p n.object_id # => 1
a = [1, 2, 3]
p a.object_id # => 5839168
fa2(a) # オブジェクトは変更されないが、その内部はメソッドコールによって変更される( Array#[]= メソッドによって)
p a.object_id # => 5839168
0824デフォルトの名無しさん
2011/02/04(金) 08:42:50class Fixnum; attr_accessor :a;end
a = 1
b = 1
a.a = 99
p b.a #=> 99
0825デフォルトの名無しさん
2011/02/04(金) 08:54:48値がコピーされる
値の中に含まれる「ポインタ」や「参照の値」を使って
参照先への操作をしない限り、呼び出し元への影響はない
参照渡し:
変数そのものが渡される
呼び出し先での仮変数への代入は、呼び出し元の変数への代入と同義になる
参照の値渡し:
「参照の値」がコピーされて渡される
その参照先への操作は呼び出し元に影響するが
仮引数そのものへの代入は、単に参照先が書き換えられるだけで元環境に影響しない
0826デフォルトの名無しさん
2011/02/04(金) 08:56:24×仮変数
○仮引数
0827デフォルトの名無しさん
2011/02/04(金) 10:47:23その後の質問(>>768)で、質問者がFixnumが値型/参照型なのかを聞いているのがわかったけどな。
>実は、Fixnumのような数値はいわゆる値型のように実装(ふるまうと)されているということでしょうか?
その質問以降でも、値渡し/参照渡しのレスをしている人が多くいるってことは、質問者の質問
の仕方が悪かったのは否めないけど。
0828デフォルトの名無しさん
2011/02/04(金) 15:17:22Pascal, Modula-2
使ったことないから知らないけど、Delphiってやつもそうか?
0829デフォルトの名無しさん
2011/02/04(金) 17:05:05ここ最近のスレで「Rubyは値渡しじゃない」という独自の解釈を押し付けようとしているのは同一人物なのか?
ここは初心者スレなんだから混乱させるのはやめろよ
あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ
他の言語では>>815のように参照渡しがサポートされているがRubyは違うだろ
>>817
「参照の値渡し」がややこしいなら、単に「値渡し」でいいよ。
Java、C#でclassをnewして、特に参照渡しだと指定せずにメソッドの引数に指定するとそれは「値渡し」だよね
参照を「値渡し」するのは今時の言語では珍しくない方法じゃないのかな?
0830デフォルトの名無しさん
2011/02/04(金) 18:07:43バグか他の実装でしょう。
0831デフォルトの名無しさん
2011/02/04(金) 18:11:050832デフォルトの名無しさん
2011/02/04(金) 18:50:26だからいちいち関数に入ったところでコピーを作るんだよね?
0833デフォルトの名無しさん
2011/02/04(金) 21:03:36参照という言葉の認識の違いですれ違ってるところまで同じかよ
とりあえず「オブジェクトそのものは渡してません」でいいじゃないか
0834デフォルトの名無しさん
2011/02/04(金) 21:17:100835デフォルトの名無しさん
2011/02/04(金) 23:14:550836デフォルトの名無しさん
2011/02/05(土) 00:43:22それ単に混同してるだけじゃね?
まあ本人から説明を聞かないことにはわからんけど
0837836
2011/02/05(土) 00:44:140838デフォルトの名無しさん
2011/02/05(土) 01:37:58# クラスがnewしかできないいくつかの言語ね
さすがのC++のカオスをしった前には、あれは英断だったんだなと思わざるをえなかった
C++の動的生成と静的生成わかれているのは、殺すためのハンター試験じゃないのかと
0839デフォルトの名無しさん
2011/02/05(土) 01:41:11俺の解釈、お前の解釈なんてしったこっちゃねーんだよ。
コンピューターのようにコードを出して、そのままの解釈をさせるようにかんけつに書け
というわけでお前らの「値渡し」と「参照の値渡し」「(あと>>796のなんだっけ?w)」
定義のコードをかけ。来てるのがRubyistじゃないならRubyじゃなくてもいい
0840デフォルトの名無しさん
2011/02/05(土) 02:15:25じゃあまずは>>839いってみようか
0841デフォルトの名無しさん
2011/02/05(土) 02:17:420842デフォルトの名無しさん
2011/02/05(土) 02:49:50300万程度の案件が1ヶ月ぐらいかかったわ
もう絶対にやらん
0843デフォルトの名無しさん
2011/02/05(土) 07:52:26俺は796じゃないけど。
> あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ
この値渡しというのは、参照の値渡しではない値渡しのこと?
もし、そうなら
ary1 = []
ary2 = ary1
ary2.push "hoge"
p ary1 #=> ["hoge"]
で終了だよね。
そうじゃないなら、>>796が間違ってるよね。参照渡しと参照の値渡しを混同してるだけ
っぽいけど。
即値はこの例がわかりやすい。
x = 100
y = 100
p x.object_id == y.object_id #=> true
即値の場合は参照の値渡しではなく、普通の値渡し。
0844デフォルトの名無しさん
2011/02/05(土) 07:56:34>>817
参照の値渡しという言葉は必要。初心者にはだるいだろうけど、覚えてもらうしかない。
値渡しと参照渡しと参照の値渡しが区別できないと、激しく混乱することになる。
0845デフォルトの名無しさん
2011/02/05(土) 07:57:100847デフォルトの名無しさん
2011/02/05(土) 08:35:50> この値渡しというのは、参照の値渡しではない値渡しのこと?
> もし、そうなら
>
> ary1 = []
> ary2 = ary1
> ary2.push "hoge"
> p ary1 #=> ["hoge"]
>
> で終了だよね。
どこが?
> Rubyは値渡しじゃないという例
ということは、参照渡しだという例を見せてくれ、ってことでしょ。
それのどこが参照渡しの例なの?
0848デフォルトの名無しさん
2011/02/05(土) 08:50:35a = "hoge"
b = a
b = "hage"
p a #=>"hage"
ってことだよね?aが指し示してるところをbに渡すんだから
0849デフォルトの名無しさん
2011/02/05(土) 09:12:20ちがうお
なんちゃら渡しは関数の実引数と仮引数の関係を説明する言葉
その例では関数が出てきていないのでなんちゃら渡しは問題にならない
0850デフォルトの名無しさん
2011/02/05(土) 09:46:51>即値はこの例がわかりやすい。
>x = 100
>y = 100
>p x.object_id == y.object_id #=> true
その例では即値かどうかはわからないよ。実際は確かに即値なんだけれども
「100という定数名があり、そこには予め
『数値の百が設定されたFixnumオブジェクトのインスタンス』
への参照が入っている」とでも表現すれば解るだろうか。
要するにそういう定義だったとしても同じ結果になってしまうんよ。
>>848
関数もしくはそれに相当するもの(Rubyではメソッド)が出てこないと説明できない。
def f(x)
x = 127
end
v = 743
f(x)
p v # => 真の意味で「参照渡し」ならば 127 になるが「参照の値渡し」であるRubyでは 743 のまま
0851デフォルトの名無しさん
2011/02/05(土) 09:57:26自分には難しくて何をやっているのかわからないけど。
[ruby-list:47825] Re: 参照渡しの実現方法は?
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/47825
0852デフォルトの名無しさん
2011/02/05(土) 10:30:47こんな実際にはできないたとえを持ち出したら
もうめちゃくちゃなのだが
0853デフォルトの名無しさん
2011/02/05(土) 10:36:42def hoge(x)
x = [3,4,5]
end
a = [0,1,2]
p a
hoge(a)
p a
もし関数hogeでxが参照渡しされていたら、2回目の表示が[3,4,5]になる
0854デフォルトの名無しさん
2011/02/05(土) 10:37:34んじゃ「リテラルがすべて同様の値を持つインスタンスへの参照だったら」とでも書けばいい?
0855デフォルトの名無しさん
2011/02/05(土) 10:41:240856デフォルトの名無しさん
2011/02/05(土) 11:05:41同じ挙動を実現できているってこと
参照渡しのルールは、渡された変数名が、元々の変数を表すかのように振舞うこと
例で何をやってるかって、メソッド呼び出し元から
変数名と変数実体との対応表(binding_obj)を受け取って、
それのもとでevalしてるだけ
0857デフォルトの名無しさん
2011/02/05(土) 11:43:58るびまの記事がちっともわかりやすくなかったということか
しくしく
0858デフォルトの名無しさん
2011/02/05(土) 11:53:52お前「同様」の意味わかってないだろ
0859デフォルトの名無しさん
2011/02/05(土) 12:01:24d
擬似参照渡しみたいなことは一応できるってことね。
>>857
執筆者?
0860デフォルトの名無しさん
2011/02/05(土) 12:30:22「同一の」…でいいのかな
0861デフォルトの名無しさん
2011/02/05(土) 12:31:49100という数値そのものではなく、100という数値のオブジェクトのことを
0862デフォルトの名無しさん
2011/02/05(土) 12:37:290863デフォルトの名無しさん
2011/02/05(土) 12:46:23ジェネリクス的なものまたはObject型なんかを使って
仮にPBR(pass by reference)というクラスにその型の変数を持たせ
swap(new PBR(a),new PBR(b))とやるしかないのではと思っている
ecmascript(javascriptやactionscript)に参照渡しは無いが
a.hogeとa["hoge"]が同じ意味をもつので
PBRはこれで代用出来る
actionscript3.0はTypedになってこの方式と相性悪くなってしまった
>>861
Readonlyな変数を参照渡ししようが値渡ししようがセマンティクスに影響はないので
あまり悩んでも意味は無いし
>>791でFixedNumの実装が即値でも参照でもいいってのはそういうことだと思う
1の値を2に書き換えて既存の1+1を全て2+2にしたいわけじゃないんでしょ?
即値のほうが効率は良いから
0864デフォルトの名無しさん
2011/02/05(土) 13:38:11どんな感じ?
0865デフォルトの名無しさん
2011/02/05(土) 17:17:27ただオブジェクトというものがあるだけ
変数はオブジェクトへの参照を格納してるだけ
メソッドコールするとそのオブジェクトへの参照を値渡ししてるだけ
Fixnumのように同じ表現だと常に同じオブジェクトを返すようなクラスは定義できるよ
class Foo
@pool = {}
def self.new(n)
return @pool[n] if @pool[n]
@pool[n] = super
end
def initialize(n) @n = n end
attr_accessor :a
end
a = Foo.new(1)
b = Foo.new(1)
a.a = 99
p b.a #=> 99
p a.object_id == b.object_id #=> true
0866デフォルトの名無しさん
2011/02/05(土) 17:39:250867デフォルトの名無しさん
2011/02/05(土) 18:24:00Matz神はかく語りき
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1514
> これは間違い.rubyには値渡ししかなく引き数として与えられた変
> 数の値を変えても元の式の値は変わりません.ただし,オブジェク
> トの参照が渡るので値に対して破壊的な操作は可能です.
でも参照を渡してるんだから参照渡しじゃんという人が
いまだ絶たないので困っちゃうというお話
実際Cのポインタの値渡しを参照渡しと説明してる本は
名著とされる本の中にも結構あるからね
0868デフォルトの名無しさん
2011/02/05(土) 19:36:110869デフォルトの名無しさん
2011/02/05(土) 21:49:25メソッド呼び出し時に、レシーバを省略すると変数と紛らわしいという問題に対して、
常にレシーバを付ければいいという主張をする人もいるようですが、
Ruby習熟者の方が良しとしているのはどういうスタイルでしょうか。
常にレシーバを付ければいい、という主張に従うと、
単純にインスタンス変数にアクセスする際にもselfが付きまとうことになり
逆に可読性が落ちるように思います。
アクセサメソッドだけ例外にして他のメソッドにのみレシーバを付ける、
なんてルールを作ってしまうと更に悲惨なことになりそうです。
やはり省略できるものは省略してしまう方がスッキリするんでしょうか。
0870デフォルトの名無しさん
2011/02/05(土) 22:08:380871デフォルトの名無しさん
2011/02/06(日) 01:09:54命名が不適切なのかもしれない。リファクタリングを検討
通常、動詞的な命名をされるはずのメソッド名と、
名詞的な命名をされるはずの変数名(アクセサメソッド名)は混同されない
>常にレシーバを付ければいいという主張をする人もいる
初耳
0872デフォルトの名無しさん
2011/02/06(日) 01:19:50個人の好みにもよると思うが、レシーバは必要なければ
可読性のために省略する方が多数派
確かMatzもそっちを推奨してたと思う(ソース不明)
俺は、「レシーバを省略するとローカル変数と記法が被る」という点は
紛らわしさもあるものの、Rubyのメリットでもあると思ってるので
基本的にためらわず省略するようにしている
>>871
「単純なアクセサではないが名詞的な命名をするメソッド」というのもあるから
一概には言えない。Pathname#realpathとか
0873デフォルトの名無しさん
2011/02/06(日) 01:37:49ワロタ
もうこれテンプレに入れとけw
0874デフォルトの名無しさん
2011/02/06(日) 02:22:24それ以来railsのモデルクラス内でカラムにアクセスする時に常にself付ける癖がついた。
0875デフォルトの名無しさん
2011/02/06(日) 02:40:32海外のRuby本やRails本を読むと、
・selfは本当に必要なとき以外は付けない(省略できるときは必ず省略する)
・ローカル変数と紛らわしくても気にしない
・returnも書かない。return XXXとは書かずに XXX だけ。
という方針のようだ。
特に2番目は、ローカル変数と同じように見えるからいいのだとでもいいそうな
雰囲気がある。
def current_average
@data / @amount
end
def main
print current_average ← こんなやつね
end
0876デフォルトの名無しさん
2011/02/06(日) 03:01:28紛らわしいとかいう時点でウンチを書いてるんだと自覚すべし。
0877デフォルトの名無しさん
2011/02/06(日) 04:49:551.Rubyは値渡し(=引数として渡された変数の値を変えても元の値は変わらない)
2.ただしオブジェクトの参照の*値*が渡される(=オブジェクトの破壊的変更は可能)
1. hoge(hage) と呼ばれたとき hage = fuga としても呼び出し元の hage は壊れない
2. hoge(hage) と呼ばれたとき hage.hige = fuga とすると呼び出し元の hage が壊れる
っていう意味だから*値渡し*で問題ないんだけど
誤解されやすい表現だよね
0878デフォルトの名無しさん
2011/02/06(日) 05:01:00>実際Cのポインタの値渡しを参照渡しと説明してる本は
>名著とされる本の中にも結構あるからね
C++ で参照が導入される前に書かれた C の本ではそう書いてあっても全くおかしくない
0879デフォルトの名無しさん
2011/02/06(日) 06:11:13おっと、リアルじゃ恥ずかしくてうかつに口だせないかw
0880デフォルトの名無しさん
2011/02/06(日) 07:38:510881デフォルトの名無しさん
2011/02/06(日) 09:04:05Rubyではどうするのでしょうか?
my $x = 1;
{
my $x = 2;
}
print $x # => 1
0882デフォルトの名無しさん
2011/02/06(日) 10:00:440883デフォルトの名無しさん
2011/02/06(日) 10:21:30Proc作ってcallするという方法はある……けど、誰かが使ってるのは見たことない
たぶん、局所的に使いたい変数があるときには
メソッドに分割するだけで十分だからじゃないかな
0884デフォルトの名無しさん
2011/02/06(日) 10:24:450885デフォルトの名無しさん
2011/02/06(日) 10:31:40Rubyでは、命名規則やメソッド分割で対処するんですね。
了解しました。
0886869
2011/02/06(日) 13:10:16皆様ありがとうございました。勉強になりました。
省略できるselfは極力省略する、というスタイルで行くことにします。
アクセサとローカル変数の紛らわしさはやはり残りそうですが。。これも慣れるのかな
0887デフォルトの名無しさん
2011/02/06(日) 16:49:490888デフォルトの名無しさん
2011/02/06(日) 17:07:25書きやすさ・読みやすさと、間違いの少なさのトレードオフだよ
0889デフォルトの名無しさん
2011/02/06(日) 17:10:140890デフォルトの名無しさん
2011/02/06(日) 18:01:00ネット上にeruby.soが落ちてないので、からソースからコンパイルして使おうとしているのですが、
require "eruby"
compiler = ERuby::Compiler.new
で、(ちなみにこれは、modrubyに組み込まれている、eruby-runから抽出した箇所です。)
.../ruby187/lib/ruby/1.8/i386-mswin32_100/eruby.so: 127: The specified procedure could not be found. - Init_eruby (LoadError)
といったエラーが出ます。
どういう原因が考えられるでしょうか。
或いは、mswin32版のeruby.soを持っていらっしゃる方UPして頂けると幸いです。
0891デフォルトの名無しさん
2011/02/06(日) 18:17:23>>869と同じ罠に何度もハマってからPythonのself明示する考え方もありだなと思えてきた。
意図しない動作をするということならテストを書けばいい話だし、
ちょっとしたスクリプトならそれこそselfの明示は面倒だし
Rubyの方針もありだと思うけど
0892デフォルトの名無しさん
2011/02/06(日) 18:19:16erbじゃだめなのか?
■ このスレッドは過去ログ倉庫に格納されています