了解attr_accessor类方法的自我

时间:2011-05-11 10:55:54

标签: ruby attr-accessor

class Test
  class << self
    attr_accessor :some

    def set_some
      puts self.inspect
      some = 'some_data'
    end
    def get_some
      puts self.inspect
      some
    end
  end
end

Test.set_some => Test
puts Test.get_some.inspect => Test nil

上面我可以找到自己作为测试本身但不返回some_data作为输出。

但是当我按照以下方式进行修改时,它会返回预期的输出

class Test
  class << self
    attr_accessor :some

    def set_some
      puts self.inspect
      self.some = 'some_data'
    end
    def get_some
      puts self.inspect
      self.some
    end
  end
end

Test.set_some => Test
puts Test.get_some.inspect => Test some_data

有什么区别?

修改

现在在第一个示例中,如果我将get some方法设置为

Test.some = 'new_data'
puts Test.some.inspect #=> new_data
Test.set_some
puts Test.get_some.inspect => new_data

现在它让我更加困惑。

5 个答案:

答案 0 :(得分:12)

some = :foo让ruby认为它应该创建一个名为some的新局部变量。如果您想致电some=(),则必须使用明确的接收方 - 例如self.some = :foo。我曾经打过赌注...: - /

答案 1 :(得分:1)

第一个例子中的(本地)变量

答案 2 :(得分:0)

在第一个示例中,some是一个局部变量。

在第二个问题中,someself的一种方法。为什么?因为attr_accessor :some与:

相同
def some= (val)
  @some = val
end

def some
  return @some
end

因此,您已为实例变量@some创建了getter和setter方法(它是对象Test的实例变量,因为每个类也是类Class的对象)。

答案 3 :(得分:0)

在第一种方法中

def set_some
  puts self.inspect
  some = 'some_data'
end

some是一个局部变量..它与@some不同,它是一个实例变量(在本例中是一个类实例变量),所以当方法结束时,该值就会消失。

如果你想调用setter方法或将@some设置为某些东西,那么就这样做

@some = 'some_data'

self.some = 'some_data'

在第二种方法

def get_some
  puts self.inspect
  self.some
end
你正在调用这个方法。返回实例变量@some ..并且因为此时@some没有值..返回nil ..

答案 4 :(得分:0)

示例1 没有方法覆盖且没有局部变量

class Foo
  def initialize
    @foo = 'foo'
  end

  def print_foo
    print @foo
    print self.foo
    print foo
  end
end

@ foo,self.foo和foo将在实例方法中访问实例变量@foo:

  
    

Foo.new.print_foo#=&gt; foofoofoo

  

示例2 ,方法覆盖

class Foo
  def initialize
    @foo = 'foo'
  end

  def foo
    return 'bar'
  end

  def print_foo
    print @foo
    print self.foo
    print foo
  end
end

@foo将访问实例变量,但self.foo和foo将调用foo覆盖方法:

  
    

Foo.new.print_foo#=&gt; foob​​arbar

  

示例3 ,带有方法覆盖和局部变量

class Foo
  def initialize
    @foo = 'foo'
  end

  def foo
    return 'bar'
  end

  def print_foo
    foo = 'baz'
    print @foo
    print self.foo
    print foo
  end
end

@foo访问实例变量,self.foo访问覆盖方法,foo访问本地变量:

  
    

Foo.new.print_foo#=&gt; foob​​arbaz