根据我对self
关键字的理解,它只是引用了类的当前实例。这不是一直都是默认行为吗?例如,不是
self.var_one = method(args)
仅相当于var_one = method(args)
?
如果是,那么自我的用途是什么?
答案 0 :(得分:116)
有几个重要的用途,其中大部分基本上是为了消除实例方法,类方法和变量之间的歧义。
首先,这是定义类方法的最佳方法。 IE:
class Foo
def self.bar
"class method bar"
end
def bar
"instance method bar"
end
end
Foo.bar #returns "class method bar"
foo = Foo.new
foo.bar #returns "instance method bar"
此外,在实例方法中,self引用实例,在类方法中它引用类,并且它总是可以用来区分局部变量。
class Bar
def self.foo
"foo!"
end
def baz
"baz!"
end
def self.success
foo #looks for variable foo, doesn't find one, looks for class method foo, finds it, returns "foo!"
end
def self.fail
baz #looks for variable baz, doesn't find one, looks for class method baz, doesn't find one, raises exception
end
def instance_success
baz #looks for variable baz, doesn't find one, looks for instance method baz, finds it, returns "baz!"
end
def instance_fail
foo #looks for variable foo, doesn't find one, looks for instance method foo, doesn't find one, raises exception
end
def local_variable
baz = "is my favorite method"
baz #looks for variable baz, finds it, returns "is my favorite method"
end
def disambiguate
baz = " is my favorite method"
self.baz + baz #looks for instance method baz, finds it, looks for local variable baz, finds it, returns "baz! is my favorite method"
end
end
因此,最后,您可以避免在许多情况下使用self
,但是继续使用它以确保您以后不会无意中创建命名冲突通常会有所帮助。有时那些可能会产生很难找到的错误。最后,这通常是个人风格的问题。
更新:如评论中所述,还有一件非常重要的事情:
在课堂上,如果你有这样的方法:
def bar=(string)
...
end
另一种方法是:
def other_method
bar = "abcd"
end
它不会调用你的bar =方法,它会创建一个局部变量栏。因此,在这种情况下,您使用self告诉ruby不要创建局部变量,如下所示:
def other_method
self.bar = "abcd"
end
如果您想使用方法的名称来获取参数,则同样适用:
def example
...
end
def other_thing(example)
self.example(example)
end
如果你离开了自己,它会认为你的意思是同名的局部变量。
因此,一般来说,方法名称中的self用于区分类和实例变量,以及当Ruby需要帮助区分方法调用和局部变量或局部变量赋值时,在其他任何地方使用它。
我希望这是有道理的!
答案 1 :(得分:54)
在大多数情况下,self.foo
确实是多余的,因为您可以为同一效果编写foo
,但在这种情况下它不是,self
是必需的。
var_one = method(args)
会创建一个名为var_one
的局部变量,它不会调用任何方法或对self
执行任何其他操作。
self.var_one = method(args)
会使用参数var_one=
调用self
上的方法method(args)
。
使用self
是非可选的另一种情况是,如果你想将它作为参数传递给方法,即some_method(self)
- 如果没有self
你就不能这样做1}}关键字。
答案 2 :(得分:4)
这是一个使用示例:
def run miles
self.miles = miles
end
在这种情况下,自我会有所帮助。在大多数情况下,自我是多余的。
答案 3 :(得分:4)
self
的另一个用途是声明类方法(类似于Java中的静态方法)。
class foo
def self.bar
#do class related stuff here
end
end
话虽如此,您也可以使用def foo.bar
代替方法签名。