使用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
代替方法签名。