使用ruby自我关键字?

从我所了解的self关键字中,它只是指当前的类的实例。 这不是在任何时候的默认行为? 例如,不是

self.var_one = method(args)相当于只是var_one = method(args)

如果是的话,那么对自己有什么用?

在大多数情况下, self.foo确实是多余的,因为你可以只写foo来达到同样的效果,但是在这种情况下,它不是,而self是必需的。

var_one = method(args)会创build一个名为var_one的局部variables,它不会调用任何方法或者做任何其他的事情。

self.var_one = method(args)将使用参数method(args)调用方法var_one= on self

另一个使用self情况是非可选的,如果你想把它作为parameter passing给一个方法,也就是说some_method(self) – 你不能在没有self关键字的情况下这样做。

有几个重要的用途,其中大部分基本上是在实例方法,类方法和variables之间进行区分。

首先,这是定义类方法的最好方法。 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指的是实例,在类方法中它指的是类,它总是可以用来区分局部variables。

 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 ,但是继续前进并使用它是很有帮助的,以确保你以后不会无意中产生命名冲突。 有时候这些可能会造成很难find的错误。 最后,这往往是个人风格的问题。


更新:正如评论中指出的,更重要的是:

在一个类中,如果你有这样一个方法:

 def bar=(string) ... end 

在另一种方法中,您可以调用:

 def other_method bar = "abcd" end 

它不会打电话给你的bar =方法,它会创build一个局部variables栏。 所以,在这种情况下,你使用self来告诉ruby不要创build一个局部variables,如下所示:

 def other_method self.bar = "abcd" end 

如果你想用一个方法的名字来进行参数的话,同样的事情也是适用的,就像这样:

 def example ... end def other_thing(example) self.example(example) end 

如果你离开了自我,它会假设你的意思是同名的本地variables。

所以,一般来说,方法名中的self用于区分类和实例variables,以及在Ruby需要帮助区分方法调用和局部variables或局部variables赋值时使用的其他地方。

我希望这是有道理的!

这里有一个例子使用:

 def run miles self.miles = miles end 

在这种情况下,自己会有帮助。 在大多数情况下,自我是多余的

self另一个用途是声明类方法(类似于Java中的静态方法)。

 class foo def self.bar #do class related stuff here end end 

这就是说,你也可以使用def foo.bar代替方法签名。