2

当我从数据库表中检索数据时,会填充一个数组。一些字段被定义为十进制和货币字段,并且在数组中它们表示为 BigDecimal。

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

4

3 回答 3

2

这是建立在@Farrel 的答案之上的,但不会用无用的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

在 Ruby 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
于 2010-02-26T11:36:25.960 回答
1
class BigDecimal
  alias old_to_s to_s

  def to_s( param = nil )
      self.old_to_s( param || 'F' )
   end
end
于 2010-02-25T15:26:30.003 回答
0

Ruby 让这一切变得简单。看哪:

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.

这种技术称为猴子修补。正如您可能从名称中猜到的那样,您应该谨慎使用它。不过,这种用法对我来说似乎是合理的。

于 2010-02-25T15:22:55.593 回答