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
现在它让我更加困惑。
答案 0 :(得分:12)
some = :foo
让ruby认为它应该创建一个名为some
的新局部变量。如果您想致电some=()
,则必须使用明确的接收方 - 例如self.some = :foo
。我曾经打过赌注...: - /
答案 1 :(得分:1)
第一个例子中的(本地)变量
答案 2 :(得分:0)
在第一个示例中,some
是一个局部变量。
在第二个问题中,some
是self
的一种方法。为什么?因为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; foobarbar
示例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; foobarbaz