在Ruby中,什么时候应该使用self.在你的班级?

Bla*_*man 15 ruby self

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

Way*_*rad 36

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

class Foo
  attr_writer :bar
  def do_something
    bar = 2
  end
end
Run Code Online (Sandbox Code Playgroud)

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

class Foo
  attr_writer :bar
  def do_something
    self.bar = 2
  end
end
Run Code Online (Sandbox Code Playgroud)

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

您也可以使用self来调用与本地变量同名的阅读器:

class Foo
  attr_reader :bar
  def do_something
    bar = 123
    puts self.bar
  end
end
Run Code Online (Sandbox Code Playgroud)

但通常最好避免给出一个与访问者同名的局部变量.


dav*_*dev 19

self引用当前对象.这适用于许多用途:

在当前对象上调用方法

class A
    def initialize val
        @val = val
    end
    def method1
        1 + self.method2()
    end
    def method2
        @val*2
    end
end
Run Code Online (Sandbox Code Playgroud)

这里跑步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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

引用属性

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

class A
    attr_accessor :val
    def initialize val
        @val = val
    end
    def increment!
        self.val += 1
    end
 end
Run Code Online (Sandbox Code Playgroud)

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

方法链

你可以回归自我,提供一种称为链的语法糖:

class A
    attr_reader :val
    def initialize val
        @val = val
    end
    def increment!
        @val += 1
        self
    end
 end
Run Code Online (Sandbox Code Playgroud)

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

A.new(1).increment!.increment!.increment!.val #returns 4
Run Code Online (Sandbox Code Playgroud)

创建类方法

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

class A
    def self.double x
          x*2
    end
    def self.quadruple x
        self.double(self.double(x))
    end
end
Run Code Online (Sandbox Code Playgroud)

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

如何确定自我的价值

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