我试图将我用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)。
我怎样才能让它发挥作用?
答案 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
对象中。这就是为什么更独立的对象设计更好。