首页 > 解决方案 > 为什么我得到一个零值(Ruby)

问题描述

我有 2 个班级,在初始化“商店”班级时,我给班级提供了一种货币。如何让我的二等舱的“@checkout_currency”采用一等舱的“@currency”值?@checkout_currency 当前等于 nil,我希望它等于 "USD"

这是我的课。

第一的..

require_relative 'convert'

class Shop

  DEFAULT_CURRENCY = "USD"

  def initialize(currency = DEFAULT_CURRENCY,
                 convert = Convert.new)
    @currency = currency
    @convert = convert

  end

  def self.currency
    @currency
  end

end

第二..

require_relative 'shop'

class Convert

  attr_reader :checkout_currency

  def initialize(checkout_currency = Shop.currency)
    @checkout_currency = checkout_currency
  end

end

标签: rubyclassinitialization

解决方案


是的,定义一个方法self将使它成为类上的方法,而不是类的任何实例上的方法。But@currency是一个实例变量——它对于 的每个实例都是不同的Shop,而不是为Shop类本身定义的。如果你有 3 个Shop不同货币的对象怎么办?

真正错误的是你的对象组合——是构造的Convert东西Shop,还是必须完全形成的东西?如果你重组到其中任何一个,你的问题就会消失。

class Shop
  def initialize(convert, currency=DEFAULT_CURRENCY)
    @convert = convert
    @currency = currency
  end
end

convert = Convert.new(Shop.DEFAULT_CURRENCY)
shop = Shop.new(convert)

或者可能:

class Shop
  def initialize(currency=DEFAULT_CURRENCY, convert_class=Convert)
    @convert = convert_class.new(currency)
    @currency = currency
  end
end

shop = Shop.new

推荐阅读