RGSS2 なぜ?なぜ?

 2010-10-11
1.self は、省略できるんじゃないの?
2.インスタンス変数を直接変えちゃダメなの?
3.どうしてモジュール内に定義するの?
4.エイリアスで、ハンドルネームやスクリプト名を加えるのはなぜ?
5.エイリアスで、先頭に _ を付けるのは、なぜ?
6.エイリアスで、シンボルを使っているものとは何か違うの?
7.|| これって何してるの?
8.\ って何?
9.not and or でエラーが出るんだけど?




self は、省略できるんじゃないの?
self.contents.clear
明示的にメソッドだと表したいときには、self を省略しません。
たとえば、同名のメソッドと変数があるときなどです。
この場合、変数が優先されるので self を付けないと変数として処理されてしまいます。
ちなみに、この例は消しても問題ないと思います。
中には、付いてないところもあったと思います。

また、アクセサ定義を行っている場合なんかにも気をつけないといけません。
class Hoge
attr_accessor :var
def initialize
var = 3
end
end
hoge = Hoge.new
p hoge.var # => nil
初期化したつもりなのに、ローカル変数として扱われています。
プロパティには、self を付けるようにしましょう。


インスタンス変数を直接変えちゃダメなの?
self.index = 0
良いときもありますが、ダメなときもあります。
例えば、インデックスを変更する場合はメソッドを使用して変更しないと、
カーソルとヘルプの更新が行われません。
インスタンス変数の操作のほかにも、一緒に別の処理を行っている場合があります。


どうしてモジュール内に定義するの?
module MOD
class Klass
end
end
この場合のモジュールは、名前空間という役割を担っています。
名前の衝突を防ぐためのものです。
こうすることで、以下のエイリアスのような冗長な命名を行わずに済みます。


ハンドルネームやスクリプト名を加えるのはなぜ?
alias _name_method_original_test method
メソッド名の衝突を防ぐためです。
自分の名前を入れることで、他者のものと被ることはまずなくなります。
さらに、スクリプト名を入れることで、自身の別のものと被ることが無くなります。


先頭に _ を付けるのは、なぜ?
alias _name_method_original_test method
なんとなくです。
特に意味はありません。
たしか、ヘルプのサンプルについてたと思います。
お好みでどうぞ。


シンボルを使っているものとは何か違うの?
alias :_name_method_original_test :method
たぶん、違いは無いと思います。
インスタンスの作成とか行われてるのかな?
ただ、alias はメソッドではなく制御構文なんで、シンボルを使うのはどうなのかな?って。
class や def と同じものなんで。
この辺は、好みの問題じゃないかな?


|| これって何してるの?
var ||= 0
return var || 0
左辺が真なら左辺を、偽なら右辺を返すという処理です。
上の例だと var = var || 0 と同じなんで、var が偽なら 0 を代入するって処理です。
つまり、var が未定義なら 0 で初期化する処理ですね。

下の例が var ? var : 0 と同じ処理です。
a ? a : b ? b : c こんな感じで入れ子になるときなんかに便利ですよ。
a || b || c でOKだから。見やすいでしょ。


\ って何?
"Hello, "\
"RGSS2!"
改行を無かったことにするやつです。
つまり、"Hello, ""RGSS2!" こういうことです。
そして、連続する文字列は結合されるので、
最終的には、"Hello, RGSS2!" というようなことになってます。
"Hello, " + "RGSS2!" より速いのかな?って思ってます。


not and or でエラーが出るんだけど?
def hoge
return not true # => ERROR
end
これは、not の優先順位が低いために起きます。
return (not true) としてやれば、エラーは起きません。
これは、代入のときにも気をつけないといけません。
var = true and false
p var # => true
代入が行われてから and が処理されているため、
変数の値は true となってしまっています。
しかも、エラーが出ません。

私は、新しい値が欲しいときに記号の方を使って、
評価後に別の処理をしたいときに英字の方を使うかな?
var = true && false or raise "true のハズだけど・・・"

完全に好みの問題だと思うので、処理の順番のことだけ頭に入れておけばOKです。
コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。


管理人のみ閲覧許可 [?]

トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/465-b9190d4a
≪ トップページへこのページの先頭へ  ≫
カレンダー
01 << 2017/02 >> 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -

カテゴリー
最近の記事
02/14 お返事
01/21 お返事
01/12 更新情報
11/28 お返事
08/08 お返事

最近のコメント
01/21 お返事
11/30 z座標
11/20 z座標
08/03 お返事
02/24 お返事

タグクラウド

リンク