トップページtech
1001コメント374KB

Ruby 初心者スレッド Part 40

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/12/11(土) 15:46:15
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0797デフォルトの名無しさん2011/02/03(木) 11:42:35
>>794
>>796みたいなアホが出てくる事を予想して先回りしてたわけだな
0798デフォルトの名無しさん2011/02/03(木) 11:55:46
「即値」の使い方でお里が知れる
0799デフォルトの名無しさん2011/02/03(木) 12:03:53
radrails入れたら、普通のruby開発もできますか?
0800デフォルトの名無しさん2011/02/03(木) 12:42:11
>>796
全然間違ってるよ。Ruby においては、
オブジェクトに原始的(primitive)かどうかなんて区別はない。

> Cとは異なり、純粋OOPであるRuby(あるいは元祖であるSmalltalk)には、
> アドレス(ポインタ)という概念がそもそも存在していないことに注意すべき。

んなことはない。むしろ Java より Ruby のほうが C の思想を引きずっていると思う。

むしろ >>769 あたりが FA なんじゃないかと。とはいえ >>794 の通りかも知れないけど。
08017962011/02/03(木) 13:03:36
>>800
>んなことはない。むしろ Java より Ruby のほうが C の思想を引きずっていると思う。

その「JavaのほうがRubyよりもOOPらしい」というところをkwsk

全体的に、否定形の文体(.... ではない)に終止している感じがする。
XXXデハナイ(XXXは誤りである)で終えずに、YYYデアル、あるいはZZZデアルのほうが、前向きな議論ができると思う。
>>769のような(C++/Java流の)値渡しによる解釈はC++/Javaに慣れた人にとっては自然かもしれないけれど、
それをアドレス(ポインタ)という概念が存在しないRubyに当てはめようとする考え方そのものに無理がある、
というのが>>796の要旨。

自分としては、正直C++/Javaには詳しくないし、
>>791の解説を一からひっくり返してくれる解釈があれば、すごく嬉しかったりする。
08028002011/02/03(木) 13:19:33
>>801
Java のほうが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
>>801
自分もRubyを使うだけで、内部のことまで考えたことはないんだけど、、、

>>791でFixnum等が実装では即値扱いになっているのは、イミュータブルだから即値として扱っても
オブジェクトとしての性質が保たれるのと、パフォーマンスの問題もあるんではないだろうか?

例えば、Fixnumをオブジェクトとして実装するとGCの回収が必要となり、速度的な問題を生じるとか。
(即値だとGCがいらないかとか知らないけど)

他の実装はどうなんだろうか?
JRubyやIronRubyもCRubyと同じような実装なんだろうか?
>>791では即値でない実装があっても構わないと書いてあるし。
0804デフォルトの名無しさん2011/02/03(木) 14:06:28
>>802
ファイルオープンのモードはJavaでも引きずってなかったっけ?
最近は違うのかも知れんけど。
0805デフォルトの名無しさん2011/02/03(木) 14:18:14
分かったから初心者スレでやるなよ。
0806デフォルトの名無しさん2011/02/03(木) 15:06:08
>>801
「値渡し」「参照渡し」はプログラミング言語一般の引数の渡し方を説明するための用語であって
Ruby内の引数の渡し方を説明するためだけの用語ではない。

「Rubyに当てはめようとする……」という指摘がそもそも無理筋。
0807デフォルトの名無しさん2011/02/03(木) 16:16:21
こういう流れって例外なく不毛だよな
0808デフォルトの名無しさん2011/02/03(木) 18:19:33
raise
0809デフォルトの名無しさん2011/02/03(木) 20:37:15
rescue
0810デフォルトの名無しさん2011/02/03(木) 20:38:48
ensure
ループする話も必要
0811デフォルトの名無しさん2011/02/03(木) 21:44:36
ちょっと疑問におもったんだが、参照の値渡しでもポインタでもない、これぞ参照渡しな言語ってどんなんがある?
できればメジャーなやつで

あと参照の値渡しとRubyの値渡しは何が違う?
0812デフォルトの名無しさん2011/02/03(木) 21:47:58
> ちょっと疑問におもったんだが、参照の値渡しでもポインタでもない、これぞ参照渡しな言語ってどんなんがある?
> できればメジャーなやつで

C++
0813デフォルトの名無しさん2011/02/03(木) 21:49:16
なぬ、Cは値渡しなのにC++は参照渡しなの!?

0814デフォルトの名無しさん2011/02/03(木) 21:52:37
&
0815デフォルトの名無しさん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
>>811
自分が知る範囲ではPerl,PHP,VB6,VB.NET/C#/C++はサポートしてる
VB6はデフォルトで参照渡し
C++/VBNET/C#はデフォルトが値渡しだが参照渡し用構文がある
Perlは参照渡しも値渡しも可能。
PHPも参照渡し可能。詳細忘れた
Cは直接サポートしてないが参照渡しのエミュレートは出来る
さっき初心者スレに書いたが元ネタはこのスレか
0817デフォルトの名無しさん2011/02/03(木) 22:24:22
参照の値渡しとかわかりづらい表現をするからややこしくなる
0818デフォルトの名無しさん2011/02/03(木) 23:20:57
ものすごくわかりやすいです
0819デフォルトの名無しさん2011/02/03(木) 23:30:19
>>817
参照渡しとごちゃ混ぜになるよりは相当マシ
0820デフォルトの名無しさん2011/02/03(木) 23:36:42
>>815
そういうのrubyでどう書くのか悩んだわ昔
0821デフォルトの名無しさん2011/02/04(金) 00:34:59
>>794
最初の質問である>>762を見る限りでは
値渡しと参照渡しについて質問してるとしか思えない
0822デフォルトの名無しさん2011/02/04(金) 03:09:47
>>762 のリンク先は卑怯だな
あたかも値のようにしか見えない例と
あたかも参照のようにしか見えない例しか乗せてないし

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
>>822
変数がさすのはあくまでオブジェクト

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:50
はいはい即値即値

class 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
>>821
その後の質問(>>768)で、質問者がFixnumが値型/参照型なのかを聞いているのがわかったけどな。

>実は、Fixnumのような数値はいわゆる値型のように実装(ふるまうと)されているということでしょうか?

その質問以降でも、値渡し/参照渡しのレスをしている人が多くいるってことは、質問者の質問
の仕方が悪かったのは否めないけど。
0828デフォルトの名無しさん2011/02/04(金) 15:17:22
>>811
Pascal, Modula-2
使ったことないから知らないけど、Delphiってやつもそうか?
0829デフォルトの名無しさん2011/02/04(金) 17:05:05
>>796
ここ最近のスレで「Rubyは値渡しじゃない」という独自の解釈を押し付けようとしているのは同一人物なのか?
ここは初心者スレなんだから混乱させるのはやめろよ

あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ

他の言語では>>815のように参照渡しがサポートされているがRubyは違うだろ

>>817
「参照の値渡し」がややこしいなら、単に「値渡し」でいいよ。

Java、C#でclassをnewして、特に参照渡しだと指定せずにメソッドの引数に指定するとそれは「値渡し」だよね
参照を「値渡し」するのは今時の言語では珍しくない方法じゃないのかな?
0830デフォルトの名無しさん2011/02/04(金) 18:07:43
作者自身(Matz)がRubyは値渡ししかありませんって言ってるんだから、あるとしたら
バグか他の実装でしょう。
0831デフォルトの名無しさん2011/02/04(金) 18:11:05
創造神まっつと>>796のたたかいが、いまはじまる
0832デフォルトの名無しさん2011/02/04(金) 18:50:26
もしかしてPerlって参照渡ししかないんじゃないの?
だからいちいち関数に入ったところでコピーを作るんだよね?
0833デフォルトの名無しさん2011/02/04(金) 21:03:36
たった一か月前のしかもこのスレの話題を繰り返すおとこのひとって……
参照という言葉の認識の違いですれ違ってるところまで同じかよ
とりあえず「オブジェクトそのものは渡してません」でいいじゃないか
0834デフォルトの名無しさん2011/02/04(金) 21:17:10
「渡す」の定義からしないとな
0835デフォルトの名無しさん2011/02/04(金) 23:14:55
コピーコンストラクタが走ってうんちゃらみたいな話はC++でこりごりよ
0836デフォルトの名無しさん2011/02/05(土) 00:43:22
>>827
それ単に混同してるだけじゃね?
まあ本人から説明を聞かないことにはわからんけど
08378362011/02/05(土) 00:44:14
ここでの混同は、「最初の質問者が」混同してるんじゃないかってことね
0838デフォルトの名無しさん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:42
kill -KILL 840
0842デフォルトの名無しさん2011/02/05(土) 02:49:50
ガラケー案件ダル過ぎる…
300万程度の案件が1ヶ月ぐらいかかったわ
もう絶対にやらん
0843デフォルトの名無しさん2011/02/05(土) 07:52:26
>>829
俺は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:10
色々と落ち着け
08468442011/02/05(土) 08:23:59
>>845
え?落ち着いてるよう。眠いけど。寝る。
0847デフォルトの名無しさん2011/02/05(土) 08:35:50
> > あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ
> この値渡しというのは、参照の値渡しではない値渡しのこと?
> もし、そうなら
>
> ary1 = []
> ary2 = ary1
> ary2.push "hoge"
> p ary1 #=> ["hoge"]
>
> で終了だよね。

どこが?

> Rubyは値渡しじゃないという例

ということは、参照渡しだという例を見せてくれ、ってことでしょ。
それのどこが参照渡しの例なの?
0848デフォルトの名無しさん2011/02/05(土) 08:50:35
自分自身の確認の為に。参照渡しって

a = "hoge"
b = a
b = "hage"
p a #=>"hage"

ってことだよね?aが指し示してるところをbに渡すんだから
0849デフォルトの名無しさん2011/02/05(土) 09:12:20
>>848
ちがうお
なんちゃら渡しは関数の実引数と仮引数の関係を説明する言葉
その例では関数が出てきていないのでなんちゃら渡しは問題にならない
0850デフォルトの名無しさん2011/02/05(土) 09:46:51
>>843
>即値はこの例がわかりやすい。
>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
> 100という定数名があり

こんな実際にはできないたとえを持ち出したら
もうめちゃくちゃなのだが
0853デフォルトの名無しさん2011/02/05(土) 10:36:42
>>848
def 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
>>852
んじゃ「リテラルがすべて同様の値を持つインスタンスへの参照だったら」とでも書けばいい?
0855デフォルトの名無しさん2011/02/05(土) 10:41:24
そうか冬休みか
0856デフォルトの名無しさん2011/02/05(土) 11:05:41
>>851
同じ挙動を実現できているってこと

参照渡しのルールは、渡された変数名が、元々の変数を表すかのように振舞うこと
例で何をやってるかって、メソッド呼び出し元から
変数名と変数実体との対応表(binding_obj)を受け取って、
それのもとでevalしてるだけ
0857デフォルトの名無しさん2011/02/05(土) 11:43:58
こんだけ初心者が混乱してるってことは
るびまの記事がちっともわかりやすくなかったということか
しくしく
0858デフォルトの名無しさん2011/02/05(土) 11:53:52
>>854
お前「同様」の意味わかってないだろ
0859デフォルトの名無しさん2011/02/05(土) 12:01:24
>>856
d
擬似参照渡しみたいなことは一応できるってことね。

>>857
執筆者?
0860デフォルトの名無しさん2011/02/05(土) 12:30:22
>>858
「同一の」…でいいのかな
0861デフォルトの名無しさん2011/02/05(土) 12:31:49
いや同一じゃないな、やっぱ同様…じゃなければ何と表現すればいいんだ
100という数値そのものではなく、100という数値のオブジェクトのことを
0862デフォルトの名無しさん2011/02/05(土) 12:37:29
最近の Ruby 案件見てると往年の VB みたいになってきたな。
0863デフォルトの名無しさん2011/02/05(土) 12:46:23
一般に参照渡しをRubyみたいなcall-by-sharingの言語で実現するには
ジェネリクス的なものまたは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
>>862
どんな感じ?
0865デフォルトの名無しさん2011/02/05(土) 17:17:27
Rubyに即値という概念はないだろう
ただオブジェクトというものがあるだけ
変数はオブジェクトへの参照を格納してるだけ
メソッドコールするとそのオブジェクトへの参照を値渡ししてるだけ

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:25
もうmatz神が直々に聖書をお書きになれば良いのでは。
0867デフォルトの名無しさん2011/02/05(土) 18:24:00
>>866
Matz神はかく語りき

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1514
> これは間違い.rubyには値渡ししかなく引き数として与えられた変
> 数の値を変えても元の式の値は変わりません.ただし,オブジェク
> トの参照が渡るので値に対して破壊的な操作は可能です.

でも参照を渡してるんだから参照渡しじゃんという人が
いまだ絶たないので困っちゃうというお話
実際Cのポインタの値渡しを参照渡しと説明してる本は
名著とされる本の中にも結構あるからね
0868デフォルトの名無しさん2011/02/05(土) 19:36:11
はい終了
0869デフォルトの名無しさん2011/02/05(土) 21:49:25
Rubyのコーディングスタイルについて教えてください。

メソッド呼び出し時に、レシーバを省略すると変数と紛らわしいという問題に対して、
常にレシーバを付ければいいという主張をする人もいるようですが、
Ruby習熟者の方が良しとしているのはどういうスタイルでしょうか。

常にレシーバを付ければいい、という主張に従うと、
単純にインスタンス変数にアクセスする際にもselfが付きまとうことになり
逆に可読性が落ちるように思います。

アクセサメソッドだけ例外にして他のメソッドにのみレシーバを付ける、
なんてルールを作ってしまうと更に悲惨なことになりそうです。

やはり省略できるものは省略してしまう方がスッキリするんでしょうか。
0870デフォルトの名無しさん2011/02/05(土) 22:08:38
インスタンス変数は直接アクセスする
0871デフォルトの名無しさん2011/02/06(日) 01:09:54
>>869
命名が不適切なのかもしれない。リファクタリングを検討
通常、動詞的な命名をされるはずのメソッド名と、
名詞的な命名をされるはずの変数名(アクセサメソッド名)は混同されない

>常にレシーバを付ければいいという主張をする人もいる
初耳
0872デフォルトの名無しさん2011/02/06(日) 01:19:50
>>869
個人の好みにもよると思うが、レシーバは必要なければ
可読性のために省略する方が多数派
確かMatzもそっちを推奨してたと思う(ソース不明)

俺は、「レシーバを省略するとローカル変数と記法が被る」という点は
紛らわしさもあるものの、Rubyのメリットでもあると思ってるので
基本的にためらわず省略するようにしている

>>871
「単純なアクセサではないが名詞的な命名をするメソッド」というのもあるから
一概には言えない。Pathname#realpathとか
0873デフォルトの名無しさん2011/02/06(日) 01:37:49
>>867
ワロタ
もうこれテンプレに入れとけw
0874デフォルトの名無しさん2011/02/06(日) 02:22:24
matzはレシーバ必ず付けろ派だったと思う。どこかで読んだが忘れた。
それ以来railsのモデルクラス内でカラムにアクセスする時に常にself付ける癖がついた。
0875デフォルトの名無しさん2011/02/06(日) 02:40:32
>>869
海外の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:55
>>867
1.Rubyは値渡し(=引数として渡された変数の値を変えても元の値は変わらない)
2.ただしオブジェクトの参照の*値*が渡される(=オブジェクトの破壊的変更は可能)

1. hoge(hage) と呼ばれたとき hage = fuga としても呼び出し元の hage は壊れない
2. hoge(hage) と呼ばれたとき hage.hige = fuga とすると呼び出し元の hage が壊れる

っていう意味だから*値渡し*で問題ないんだけど
誤解されやすい表現だよね
0878デフォルトの名無しさん2011/02/06(日) 05:01:00
>>867
>実際Cのポインタの値渡しを参照渡しと説明してる本は
>名著とされる本の中にも結構あるからね

C++ で参照が導入される前に書かれた C の本ではそう書いてあっても全くおかしくない
0879デフォルトの名無しさん2011/02/06(日) 06:11:13
おまいらそういう話題はruby-listでやれよ…
おっと、リアルじゃ恥ずかしくてうかつに口だせないかw
0880デフォルトの名無しさん2011/02/06(日) 07:38:51
おまえ誰だ?
0881デフォルトの名無しさん2011/02/06(日) 09:04:05
Perlだと局所的に使いたい変数があるときは { }(中括弧)を使いますが、
Rubyではどうするのでしょうか?

my $x = 1;

{
my $x = 2;
}

print $x # => 1
0882デフォルトの名無しさん2011/02/06(日) 10:00:44
同じ変数名を使おうとしている命名規則もしくは設計を見直す
0883デフォルトの名無しさん2011/02/06(日) 10:21:30
>>881
Proc作ってcallするという方法はある……けど、誰かが使ってるのは見たことない

たぶん、局所的に使いたい変数があるときには
メソッドに分割するだけで十分だからじゃないかな
0884デフォルトの名無しさん2011/02/06(日) 10:24:45
要するに、できない
0885デフォルトの名無しさん2011/02/06(日) 10:31:40
>>882-884
Rubyでは、命名規則やメソッド分割で対処するんですね。
了解しました。
08868692011/02/06(日) 13:10:16
返事が遅れてすいません。
皆様ありがとうございました。勉強になりました。

省略できるselfは極力省略する、というスタイルで行くことにします。
アクセサとローカル変数の紛らわしさはやはり残りそうですが。。これも慣れるのかな
0887デフォルトの名無しさん2011/02/06(日) 16:49:49
変な文化だよな。常にself付けておけば間違いも無くなるのに。
0888デフォルトの名無しさん2011/02/06(日) 17:07:25
>>887
書きやすさ・読みやすさと、間違いの少なさのトレードオフだよ
0889デフォルトの名無しさん2011/02/06(日) 17:10:14
Ruby初心者が読みやすいコードと、Ruby熟練者が読みやすいコードは、こらまた違うんだよな。
0890デフォルトの名無しさん2011/02/06(日) 18:01:00
WindowsでRuby1.8.7を使ってます。
ネット上に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
>>887
>>869と同じ罠に何度もハマってからPythonのself明示する考え方もありだなと思えてきた。

意図しない動作をするということならテストを書けばいい話だし、
ちょっとしたスクリプトならそれこそselfの明示は面倒だし
Rubyの方針もありだと思うけど
0892デフォルトの名無しさん2011/02/06(日) 18:19:16
>>890
erbじゃだめなのか?
0893デフォルトの名無しさん2011/02/06(日) 18:27:00
LINK : fatal error LNK1104: ファイル 'C:\Windows\Microsoft.NET\Framework\v4.0.30
319;C:\Windows\Microsoft.NET\Framework\v3.5;C:\Program.obj' を開くことができませ
ん。

ってなコンパイルエラーがでたので、該当箇所っぽいところを


--- DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)
+++ DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll
--- EXT_DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)
+++ EXT_DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll

としたのがだめだったのでしょうか。。。


>>892
せっかくCのeRuby実装があるのでパフォーマンスのためにも、使ってみたいのです
0894デフォルトの名無しさん2011/02/06(日) 18:40:13

LIBPATH = "C:/Program Files/Microsoft Visual Studio 10.0/VC/LIB/"
or
LIBPATH = "C:\Program Files\Microsoft Visual Studio 10.0\VC\LIB\"
or
LIBPATH = "C:\Program Files\Microsoft Visual Studio 10.0\VC\LIB"

DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)
LDSHARED = cl -nologo -LD
EXT_DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)


などと直しても、

LINK : fatal error LNK1181: 入力ファイル 'C:/Program Files/Microsoft Visual Stud
io 10.0/VC/LIB.obj' を開けません。

となります。
0895デフォルトの名無しさん2011/02/06(日) 21:43:35
スレ違い
0896デフォルトの名無しさん2011/02/06(日) 23:43:19
>>890
devkitでコンパイルしたほうが早そう
■ このスレッドは過去ログ倉庫に格納されています