【问题标题】:Ruby: Add methods into an object to return simple numeric valuesRuby:将方法添加到对象中以返回简单的数值
【发布时间】:2017-11-03 17:24:16
【问题描述】:

我正在使用 ruby​​ 1.8.6(不要去那里)。假设我有一个名为 results 的数组:我希望它响应一个新方法“current_page”,它只返回一个数字。

当我设置我想要的这个值时,我将它放在一个局部变量中,如下所示:

page = 3

我想修改我的数组,这样如果我调用 my_array.current_page,我会得到 3,或者我的局部变量 page 中保存的值。

最简单/最好的方法是什么?我试过这个:

@page = page
def my_array.current_page
  @page
end

但是,当它被评估时,@page 可能不在身边。我需要对方法进行“硬编码”,以返回 @page 的当前值。

每个数组对象都需要能够不同,所以不能设置类方法。

我想到最好的方法可能是在 Array 类中添加一个 attr_accessor 字段,然后对其进行设置:我认为这行不通,因为 my_array 对象在我修改它的类之前已被实例化,但它似乎确实有效:

class Array; attr_accessor :current_page; end

my_array.current_page = page
my_array.current_page
=> 3

这实际上似乎有效。但这是最好的方式吗?在我的代码中间给 Array 打补丁感觉很可怕。

【问题讨论】:

  • 如果你不想猴子补丁Array,那你为什么要打电话给Array#current_page呢?你不能定义一些包装对象来包含你的原始数组吗?
  • 最好的方法是像@TomLord 提到的那样创建一个包装器。这将允许您将分页问题与本机 Array 分开,并在复杂性扩大时提供更大的灵活性

标签: ruby dynamic mixins


【解决方案1】:

你可以像这样对my_array 进行猴子补丁:

my_array = [1,4,6]
page = 3

def my_array.current_page=(num)
  @page = num
end
def my_array.current_page
  @page
end

my_array.current_page = page
p my_array.current_page  # =>3

【讨论】:

  • 可以简化为my_array.singleton_class.class_eval { attr_accessor :current_page }a.singleton_class.send(:attr_accessor, :current_page)
  • 谢谢 - 即使猴子补丁不是最好的方法,我想这也是我试图做的。
猜你喜欢
  • 2010-10-28
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2020-03-06
  • 2015-05-27
  • 2011-10-16
相关资源
最近更新 更多