在money gem中初始化方法

时间:2015-04-03 16:36:06

标签: ruby money-rails

我正在阅读money宝石源代码,我似乎无法理解构造函数:

def initialize(obj, currency = Money.default_currency, bank = Money.default_bank)
    @fractional = obj.respond_to?(:fractional) ? obj.fractional : as_d(obj)
    @currency   = obj.respond_to?(:currency) ? obj.currency : Currency.wrap(currency)
    @currency ||= Money.default_currency
    @bank       = obj.respond_to?(:bank) ? obj.bank : bank
  end

为什么我们测试obj是否有"fractional"方法?什么时候返回true,什么时候返回false?下一行中的货币问题相同。

由于

1 个答案:

答案 0 :(得分:1)

这些检查允许以obj传递各种内容并智能地执行操作。这是使用"鸭子打字的一个例子 - 我们并不关心它实际上是什么,但如果它像鸭子一样嘎嘎叫,那就把它当成一个用于嘎嘎叫的目的。来源评论:

# @param [Object] obj Either the fractional value of the money,
# a Money object, or a currency. (If passed a currency as the first
# argument, a Money will be created in that currency with fractional value
# = 0.
# @param [Currency, String, Symbol] currency The currency format.
# @param [Money::Bank::*] bank The exchange bank to use.
#
# @example
# Money.new(100) #=> #<Money @fractional=100 @currency="USD">
# Money.new(100, "USD") #=> #<Money @fractional=100 @currency="USD">
# Money.new(100, "EUR") #=> #<Money @fractional=100 @currency="EUR">

意图似乎是您可能想要传递Money对象:如果是,您希望使用相同的fractionalcurrency。如果没有这些方法,请将其视为数字。