ruby的self怎么使用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

根据我所了解的self,它只是指当前的类实例。

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

如果是的话,那么self有什么用?

提问于
用户回答回答于

在大多数情况下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关键词。

用户回答回答于

有几个重要的用途,其中大多数基本上是消除实例方法、类方法和变量之间的歧义。

首先,这是定义类方法的最佳方法。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,但是继续使用它来确保以后不会无意中创建命名冲突通常是有帮助的。有时,它们会产生很难找到的bug。

扫码关注云+社区