15

你什么时候self.property_name在Ruby中使用?

4

3 回答 3

36

调用类的 mutator 时使用 self。例如,这不起作用:

class Foo
  attr_writer :bar
  def do_something
    bar = 2
  end
end

问题是'bar = 2' 创建了一个名为'bar' 的局部变量,而不是调用由attr_writer 创建的方法'bar='。但是,一点点self可以解决它:

class Foo
  attr_writer :bar
  def do_something
    self.bar = 2
  end
end

self.bar = 2根据需要调用方法bar=

您还可以使用 self 调用与局部变量同名的读取器:

class Foo
  attr_reader :bar
  def do_something
    bar = 123
    puts self.bar
  end
end

但通常最好避免给局部变量赋予与访问器相同的名称。

于 2011-02-21T16:38:47.197 回答
21

self引用当前对象。这有很多用途:

调用当前对象的方法

class A
    def initialize val
        @val = val
    end
    def method1
        1 + self.method2()
    end
    def method2
        @val*2
    end
end

在这里运行A.new(1).method1()将返回3。这里的使用self是可选的——下面的代码是等价的:

class A
    def initialize val
        @val = val
    end
    def method1
        1 + method2()
    end
    def method2
        @val*2
    end
end

self虽然为此目的并不是多余的 - 运算符重载使其成为必要:

class A
    def initialize val
        @val = val
    end
    def [] x
        @val + x
    end
    def method1 y
        [y] #returns an array!
    end
    def method2 y
        self.[y] #executes the [] method
    end
end

这显示了如果要调用当前对象的[]方法,必须如何使用 self。

引用属性

attr_accessor您可以使用and co生成读取和写入实例变量的方法。

class A
    attr_accessor :val
    def initialize val
        @val = val
    end
    def increment!
        self.val += 1
    end
 end

在这里使用 self多余的,因为您可以直接引用变量,例如。@val. 使用上一个类,A.new(1).increment!将返回 2。

方法链

您可以返回 self 以提供一种称为链接的语法糖形式:

class A
    attr_reader :val
    def initialize val
        @val = val
    end
    def increment!
        @val += 1
        self
    end
 end

在这里,因为我们返回的是当前对象,所以可以链接方法:

A.new(1).increment!.increment!.increment!.val #returns 4

创建类方法

您可以使用 self 定义类方法:

class A
    def self.double x
          x*2
    end
    def self.quadruple x
        self.double(self.double(x))
    end
end

这将使您能够调用A.double(2) #= 4A.quadruple(2) #=8。请注意,在类方法中,self引用该类是因为该类是当前对象。

self 的值是如何确定的

特定方法中 self 的当前值设置为调用该方法的对象。通常这使用“。” 符号。当您运行时some_object.some_method(),self 在 some_method 的持续时间内绑定到 some_object,这意味着 some_method 可以通过上述方式之一使用 self。

于 2011-02-21T20:22:56.927 回答
0

使用selfis used 将引用程序中可访问的当前对象。因此,当通过某种 a 访问变量时,会使用 self.property attr_accessor。在必须的情况下,它可以用来代替对象内的@property。

于 2011-02-21T16:30:02.657 回答