尝试学习 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_hi
orsay_bye
变量name
。
问题:
1 - 是否需要获得对类@
中@name
所有方法可见的能力,还是这个约定?如果是惯例,那@
意味着什么?(我将其等同于$this
在 JQuery 中声明的变量,它表示该变量是 JQuery 元素,与查询时不同$('whatever')
)
2 - 该方法的initialize
作用类似于类内的 getter/setter 方法Greeter
吗?
3 - 非常欢迎您对我的逻辑、代码和问题的假设提出任何其他意见!