如何使用符号在Ruby中引用对象?

时间:2017-12-11 04:07:52

标签: ruby class oop

我试图将我用Ruby编写的项目转换为使用Classes。

Block I目前正在使用:

elements.each do |element, value|
    value /= 100
    total.push(value * price[element])
end

完整代码:https://gist.github.com/gbourdon/53d3d125b04a9394164daca01b657987

哈希结构:

price = {o: 0.30, c: 2.40, h: 12.00, etc.}

我需要存储在散列中的符号(例如,:o)能够引用具有相同名称的对象(例如,对象o)。

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

这是一个经过重新设计的Ruby-ified版本的代码,可以避免完全拥有这些变量。如果你看一下这里的操作你就不在乎了,特别是元素是什么,你只关心它的价值和每单位重量的相对丰富度。

重组的Element类看起来像这样:

class Element
  attr_reader :symbol
  attr_reader :price
  attr_reader :amount

  def initialize(symbol, price, amount)
    # Cocerce both inputs into floats
    @symbol = symbol
    @price = price.to_f
    @amount = amount.to_f
  end
end

现在,它包含对元素本身很重要的信息,如符号。保持符号像变量名这样的位置实际上非常烦人,因为变量名称不应该具有这样的重要意义,它们应该只是为了可读性。

现在,您可以在一个容器对象中一次性定义所有元素:

ELEMENTS = [
  Element.new('O', 0.30, 0.65),
  Element.new('C', 2.40, 0.18),
  Element.new('H', 12, 0.10),
  Element.new('N', 0.40, 0.03),
  Element.new('Ca', 11, 0.015),
  Element.new('P', 4, 0.01),
  Element.new('K', 85, 0.0035),
  Element.new('S', 0.25, 0.0025),
  Element.new('Cl', 0.15, 0.0015),
  Element.new('Na', 7, 0.0015)
]

最终可以简化生成的可执行文件,尤其是在输入转换时:

# Take input from the command-line to make re-running this easier
pounds = ARGV[0].to_i

# Quick conversion in one shot. Try and keep variables all lower_case
kg = pounds * 0.4536 * 1000

现在您需要做的就是将该表中的每个元素转换为基于权重的净价格:

# Convert each element into its equivalent value by weight
total = ELEMENTS.map do |element|
  element.price * element.amount * kg
end.reduce(:+) # Added together

这里reduce替换了不必要的Array方法。它确实是你需要的。 Rails实际上有一个sum方法,这更容易。

然后呈现:

puts "You are worth: $#{(total / 100).round(2)}"

就是这样。

使用这种新结构,您可以扩展功能,根据需要按元素详细分解价格,所有必要信息都包含在element对象中。这就是为什么更独立的对象设计更好。