Ruby を学習しようとしていて、チュートリアルで、このページのこのコードに出くわしました:
class Greeter
def initialize(name = "World")
@name = name
end
def say_hi
puts "Hi #{@name}!"
end
def say_bye
puts "Bye #{@name}, come back soon."
end
end
また、@name
変数はインスタンス変数であり、クラス内のすべてのメソッド (この場合はGreeter
) にスコープが設定されていることもわかりました。私は JS に精通していますが、スコープに関して少し混乱しています。少し明確にさせてください。JSのコードについての私の理解は次のとおりです。
function Greeter (name){
name = (typeof name === "undefined") ? "World" : name;
function say_hi (name){
alert('Hi ' + this.name);
};
function say_bye (name){
alert('Bye ' + this.name + ', come back soon.');
};
};
ruby の例では、 というメソッドがあるようinitialize
ですが、Ruby では、パラメーター内で変数を定義するという贅沢が得られるのではないでしょうか? そのinitialize
中で var を定義し@name
ます。JS の例では、WITHIN &という名前を意味するname
ことを宣言することで、 var の命名を明示的に抽象化しています。これはスコープを区別するための優れたコーディング プラクティスであると理解していますが、この場合はコード全体で同じままで、空のパラメーターが渡された場合は "World"、またはパラメーターとして渡された人の名前のいずれかになります。いずれにせよ、これが JS で可能であることを認識していないため、Ruby でスコープがどのように機能するかはわかりません。上記の JS コードを取得して、以下と比較してください。this.name
say_hi
say_bye
name
function Greeter (name){
function say_hi (name){
this.name = (typeof name === "undefined") ? "World" : name;
alert('Hi ' + this.name);
};
function say_bye (name){
this.name = (typeof name === "undefined") ? "World" : name;
alert('Bye ' + this.name + ', come back soon.');
};
};
this.name
サブメソッドでを宣言できなかった場合、それは、または変数ではなく、Greeter
クラス変数を意味する可能性があります。name
say_hi
say_bye
name
質問:
1 -クラス内のすべてのメソッドに表示される機能を得るため@
に必要ですか、それともこの規則ですか? @name
それが慣習である場合、何@
を意味しますか? (私はこれを JQuery のように宣言された変数と同一視してい$this
ます。変数が JQuery 要素であることを意味します$('whatever')
。
2 - メソッドは、クラスinitialize
内で範囲指定された getter/setter メソッドのように動作していますか?Greeter
3 - 私のロジック、コード、および質問に対するあなたの仮定に関するその他のコメントは大歓迎です!