使用ruby self关键字?

时间:2011-07-12 18:56:25

标签: ruby instance self

根据我对self关键字的理解,它只是引用了类的当前实例。这不是一直都是默认行为吗?例如,不是

self.var_one = method(args)仅相当于var_one = method(args)

如果是,那么自我的用途是什么?

4 个答案:

答案 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代替方法签名。