在“ initialize”方法中访问实例变量

时间:2019-04-15 22:36:51

标签: ruby oop object

给出Ruby中的这个基本类:

#include "opencv2/highgui.hpp" 
#include "opencv2/opencv.hpp" 
#include "supportFile.h" 
#include "supportFile2.h" 

int main(int argc, char* argv[]) { 

initializeBoard(); brake = 0; speed = 70; usmAngle = 5; value = 4;
setRS485ServoPosition(USM,0,usmAngle); 
setRS485ServoPosition(CAMERASERVO,0,value); 
... 

然后如何在不创建getter函数的情况下直接从class TestClass def initialize(name) @name = name end end 方法内部访问实例变量名称?这有可能吗? (即使用点符号)还是initialize方法在实例化一个类后就不存在了,因此需要定义一个getter方法吗?

我想问的是initialize是类还是实例方法?

2 个答案:

答案 0 :(得分:2)

是的,有办法。但这不是传统的方法。更像是查询要知道的对象

TestClass.new("foo").instance_variable_get(:@name)
=> "foo"

initialize方法不会“停止存在”。它被执行了,就是这样。在您的情况下,您的方法所做的是设置了变量。

答案 1 :(得分:1)

定义了“ getter方法”,以便您可以从类外部使用变量:

class TestClass
  attr_reader :name

  def initialize(name)
    @name = name
  end
end
# TestClass.new('Ben').name  # => 'Ben'

如果您不需要从班级外部访问它,则只需使用@name

class TestClass
  def initialize(name)
    @name = name
  end

  def greet
    puts "Hello, %s" % @name
  end
end
# TestClass.new('Ben').greet # outputs: Hello, Ben

您可以在内部使用@name进行初始化:

class TestClass
  def initialize(name)
    @name = name
    puts "Name backwards: %s" % @name.reverse
  end
end
# TestClass.new('Ben') # outputs neB

初始化是一种特殊的方法,当您定义initialize实例方法时,它会自动标记为private。创建类的实例后,类方法new对其进行调用。

没有什么可以阻止您从类内部调用私有方法:

class TestClass
  def initialize(name)
    @name = name
    puts "Name is now %s" % @name
  end

  def flip_name
    initialize(@name.reverse)
  end
end
# t = TestClass.new('Ben') # outputs "Name is now Ben"
# t.flip_name # outputs "Name is now neB"
# t.instance_variable_get(:@name) # => 'neB'

调用flip_name的{​​{1}}方法可以很好地工作,但这当然是非常常规的,并且几乎没有用过,因为它没有太大意义。

可以使用initialize从类外部调用私有方法:

send

不发送,您将得到# t.send(:initialize, 'Bill') # outputs "Name is now Bill" # t.instance_variable_get(:@name) # => 'Bill'

NoMethodError

Ruby 1.9 beta版将> t.initialize('Jack') NoMethodError: private method `initialize' called for #<TestClass:0x00007fa2df8e4570> 更改为今天的send,只允许访问公共方法,如果您确实想使用public_send来调用私有方法,例如用于单元测试。我认为这引起了太多的兼容性问题,并且更改已还原。

因此,总而言之,可以的,您可以再次调用funccall,并且它不会停止存在,但是几乎没有做过,因为它意义不大。要从类内部访问实例变量,请使用initialize之类的@表示法,要从类外部访问它们,请定义一个getter。

相关问题