Ruby 获取类的属性读取器、写入器或访问器

Ruby 获取类的属性读取器、写入器或访问器,ruby,methods,metaprogramming,Ruby,Methods,Metaprogramming,我目前正在用ruby进行一些元编程,并且我正在尝试隔离类的方法(该类位于另一个文件中,我根据需要获得)。由于klass.public_instance_方法(false),我可以得到所有的方法,但在同一时间,给定的数组也具有类的所有属性。我怎样才能把他们隔离开来?在其他与此相关的问题中,他们建议使用klass.instance_变量,但当我这样做时,它只返回一个空数组 我似乎不能把我的头绕在那个上面。我不明白为什么现在还没有一个专门的方法 例如: 我在这个类中有一个文件: class T

我目前正在用ruby进行一些元编程,并且我正在尝试隔离类的方法(该类位于另一个文件中,我根据需要获得)。由于klass.public_instance_方法(false),我可以得到所有的方法,但在同一时间,给定的数组也具有类的所有属性。我怎样才能把他们隔离开来?在其他与此相关的问题中,他们建议使用klass.instance_变量,但当我这样做时,它只返回一个空数组

我似乎不能把我的头绕在那个上面。我不明白为什么现在还没有一个专门的方法

例如:

我在这个类中有一个文件:

class T
    attr_reader:a
    def initialize(a)
        @a = a
    end
    def meth
        #code here
    end
end
在另一个文件中,我有

require_relative 'T.rb'
class meta
   def initialize
       methods = T.public_instance_methods(false) #=> here methods = [:a,:meth] but I would want only to have [:meth]
       #rest of code
   end
end

对于定义如下的类:

class Klass
    attr_accessor :variable
    def initialize(variable)
        @variable = variable
    end

    def method
    end
end
您可以使用
public\u instance\u方法
instance\u变量
方法查找公共非attr实例方法

public_instance_methods  = Klass.public_instance_methods(false)
#  [:method, :variable, :variable=]

instance_variables = Klass.new(nil).instance_variables
# [:@variable]

getters_and_setters = instance_variables
                        .map(&:to_s)
                        .map{|v| v[1..-1] }
                        .flat_map {|v| [v, v + '=']}
                        .map(&:to_sym)
# [:variable, :variable=]

without_attr = public_instance_methods - getters_and_setters
# [:method]

这是不可能的。Ruby的“属性”是完全正常的方法。没有办法将它们与其他方法区分开来。例如,这两个类完全无法区分:

class Foo
   attr_reader :bar
end

class Foo
   def bar
     @bar
   end
end
你可以试着聪明一点,根据实例变量过滤掉它们,但这是危险的:

class Foo
  # can filter this out using @bar
  attr_writer :bar
  def initialize
    @bar = []
  end
end

class Foo
  def initialize
    @bar = []
  end

  # this looks the same as above, but isn't a normal attribute!
  def bar= x
    @bar = x.to_a
  end
end

你能用一个例子来解释吗?@VishalTajPM我添加了一个例子“给定的数组也具有类的所有属性”-什么属性?访问者
attr_accessor
是一个简单的宏,定义了两个实例方法。不多也不少。这些方法没有什么特别之处。是的!非常感谢你,就是这样!我错过了这门课的例题,这就是为什么它没有在早些时候起作用。@Lusheez我很高兴我能帮上忙。另外,我更新了我的答案,因为原始代码只对getter有效-它没有从
public\u instance\u methods
array中减去
=
方法。这只在
initialize
创建所有实例变量时有效。通常情况下,可以随时定义实例变量,因此无法区分非属性方法和尚未定义变量的getter。感谢您提供的信息,尽管出于我的确切目的,Maciej提出的解决方案非常适合!