1

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.namesay_hisay_byename

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クラス変数を意味する可能性があります。namesay_hisay_byename

質問:

1 -クラス内のすべてのメソッドに表示される機能を得るため@に必要ですか、それともこの規則ですか? @nameそれが慣習である場合、何@を意味しますか? (私はこれを JQuery のように宣言された変数と同一視してい$thisます。変数が JQuery 要素であることを意味します$('whatever')

2 - メソッドは、クラスinitialize内で範囲指定された getter/setter メソッドのように動作していますか?Greeter

3 - 私のロジック、コード、および質問に対するあなたの仮定に関するその他のコメントは大歓迎です!

4

2 に答える 2

1

@JavaScriptとほぼ同じthisで、現在のインスタンスを参照します。クラスのinitializeメソッドはコンストラクターであり、ゲッター/セッターではありません。

function Greeter( name ) { 
    /*Functions called with `new` return objects
     with their proto link pointing to the object
     pointed at function's .prototype property at the time of instanciation. */
    this.name = arguments.length < 1 ? "World" : name; //No real way to do optional arguments
}

Greeter.prototype.say_hi = function() {
    alert( "Hi " + this.name + "!" ); //Methods are defined outside on the `.prototype` object
};

Greeter.prototype.say_bye = function() {
    alert( "Bye " + this.name + ", come back soon." );
};
于 2012-11-26T10:30:49.777 に答える
0
  1. @jsのように@name、インスタンス変数として宣言する必要があります。{name : 'foo'}
  2. initializejsのようConstructorに動作します。new Constructor(foo, bar)の場合new Constructor(foo, bar)、rubyはConstructor#initialize引数fooと。を使用して呼び出しますbar

jsとrubyを比較するのは最善ではないと思います。rubyはクラスベースのOOPであり、C++やJavaに似ています。

于 2012-11-26T10:10:13.190 に答える