正如我从数据库表中检索数据的阵列被填充。一些字段被定义为十进制&货币字段并且它们被表示为的BigDecimal在阵列内。

我使用这些数组值来填充CSV文件,但问题是,所有的BigDecimal值是通过在科学格式表示(其表示BigDecimal to_s方法的默认行为)默认值。我可以通过使用to_s(“F”)示出的值,但如何可以覆盖默认?

有帮助吗?

解决方案

这是建立在@法雷尔的答案,但没有与无用old_xyz方法污染的方法命名空间。另外,为什么不直接使用默认参数?

class BigDecimal
  old_to_s = instance_method :to_s

  define_method :to_s do |param='F'|
    old_to_s.bind(self).(param)
  end
end

在红宝石1.8,这略微丑陋得到:

class BigDecimal
  old_to_s = instance_method :to_s

  define_method :to_s do |param|
    old_to_s.bind(self).call(param || 'F')
  end
end

或者,如果你不喜欢你与上面的代码得到警告:

class BigDecimal
  old_to_s = instance_method :to_s

  define_method :to_s do |*param|
    old_to_s.bind(self).call(param.first || 'F')
  end
end

其他提示

class BigDecimal
  alias old_to_s to_s

  def to_s( param = nil )
      self.old_to_s( param || 'F' )
   end
end

红宝石使这容易。看哪:

class BigDecimal
  def to_s
    return "Whatever weird format you want"
  end
end

# Now BigDecimal#to_s will do something new, for all BigDecimal objects everywhere.

此技术被称为猴修补。正如你可能从名字猜测,它的东西,你应该慎用。这种使用似乎是合理的我,虽然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top