【问题标题】:Ruby - Method AttributesRuby - 方法属性
【发布时间】:2012-07-15 18:52:22
【问题描述】:

有没有办法将属性分配给方法?我知道你可以用类来做到这一点,但我有一系列类似的方法,如果我可以为每个人分配一个属性,那真的很有帮助。有谁知道如何做到这一点,或者在 Ruby 中是否有可能?

编辑:我的意思是,当你有一个类时,你可以像这样为它分配属性:

 class Person
  attr_accessor :age
  ...
 end

我想知道是否也可以使用这样的方法来做到这一点:

class Trucks
 def get_fire_truck_name
   attr_accessor :size
   ...
 end
end

(顺便说一句,这只是一个例子。实际的程序要复杂得多,这就解释了为什么我不能简单地将我的方法变成类来赋予它们属性。)

【问题讨论】:

  • 你应该提供例子来描述你的问题,否则你的问题是错误的。
  • 就像你可以用 Python 或 Javascript 做的那样? Ruby 的方法不是对象,所以答案是否定的。
  • @tokland Ruby 方法是 definitely objects
  • 是的,我想我不能按照我想要的方式去做,但我想我已经找到了解决这个问题的方法。无论如何,谢谢你们的帮助!
  • Brandan:有一个名为Method 的类这一事实并没有说明方法本身就是对象。可以像使用字符串或块一样发送方法作为参数吗?不,您必须先将它们转换为 Method 对象:obj.method(:name)。方法在 Ruby 中不是一流的,块才是。 stackoverflow.com/a/2602485/188031

标签: ruby methods attributes


【解决方案1】:

由于方法是 Ruby 中的对象,因此您可以像定义任何其他对象一样在 Method 对象上定义方法。如果你特别想使用attr_accessor,可以这样打开方法的eigenclass

class Person
  attr_accessor :age
end

m = Person.instance_method(:age)
class << m
  attr_accessor :units
end

m.units = 'years'
puts m.units       #=> 'years'

您还可以使用 def 关键字显式定义对象上的方法:

def m.units
  @units || 'years'
end

def m.units=(u)
  @units = u
end

puts m.units
m.units = 'decades'
puts m.units

【讨论】:

    【解决方案2】:

    如果您只是在谈论能够将方法作为对象上的变量调用,那么我知道至少有三个路径...

    使用 attr_reader 访问器 Accessors

    attr_reader :your_cool_method_name
    

    您可以在对象上调用发送。请注意,这种方式忽略了范围(公共、受保护、私有)

    @object.send :your_cool_mehod_name
    

    或者你可以通过 method_missing 调用来实现,但这有点高级,根据你的问题,我会推迟这种方法,直到你对 Ruby 的熟悉程度增加。

    【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2014-02-01
    • 2010-11-14
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多