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 示例中,我明确抽象了 var 的命名name,通过声明this.name为 WITHIN say_hi&的名称say_bye。我理解这是一种很好的编码实践,可以区分范围,即使在这种情况下name在整个代码中保持不变,如果传递了一个空参数,则要么是“世界”,要么是作为参数传递的人的姓名。无论哪种方式,我都不确定 Ruby 中的作用域是如何工作的,因为我不知道这在 JS 中是可能的。拿上面的 JS 代码,比较一下:

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在子方法中声明 the ,则可能分别表示Greeter类变量name,而不是say_hiorsay_bye变量name

问题:

1 - 是否需要获得对类@@name所有方法可见的能力,还是这个约定?如果是惯例,那@意味着什么?(我将其等同于$this在 JQuery 中声明的变量,它表示该变量是 JQuery 元素,与查询时不同$('whatever')

2 - 该方法的initialize作用类似于类内的 getter/setter 方法Greeter吗?

3 - 非常欢迎您对我的逻辑、代码和问题的假设提出任何其他意见!

4

2 回答 2

1

@与javascript中的大致相同this,它指的是当前实例。类中的initialize方法是构造函数,而不是 getter/setter。

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. @必须声明@name为实例变量,就像{name : 'foo'}在 js 中一样;
  2. initialize就像Constructornew Constructor(foo, bar)js 中一样。当new Constructor(foo, bar), ruby​​ 将调用Constructor#initialize参数foobar.

我认为将js与ruby进行比较并不是最好的;ruby 是基于类的 OOP,类似于 C++ 和 Java。

于 2012-11-26T10:10:13.190 回答