【问题标题】:How can you use a symbol to reference an object in Ruby?如何使用符号来引用 Ruby 中的对象?
【发布时间】:2017-12-11 04:07:52
【问题描述】:

我正在尝试将我用 Ruby 编写的项目转换为使用类。

我目前正在使用的块:

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)。

我怎样才能让它工作?

【问题讨论】:

  • 不要用o 之类的名称声明一堆变量,而是将它们组织成一个结构并保持键控。这将使查找它们显着更容易,我认为这些变量是你问题的根源。 elements[:o] 比查找变量 o 更容易方式

标签: ruby class oop


【解决方案1】:

这是一个重新设计的、Ruby 化的代码版本,它完全避免了使用这些变量的需要。如果你看这里的操作你并不关心,特别是元素是什么,你只关心它的价值和每单位重量的相对丰度。

重组后的 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 对象中。这就是为什么更独立的对象设计更好。

【讨论】:

  • 正如我喜欢说的:Ruby 是一种面向对象的语言,而不是面向符号哈希值的语言,所以使用对象,而不是符号哈希值浮动,一切都会变得容易得多。
  • @JörgWMittag 有时“愚蠢”的数据结构足以应付手头的任务。有时它们需要更聪明才能使它们更容易扩展。这并不总是一个明确的电话。我仍然宁愿拥有一个不稳定的巴洛克式数据结构,而不是像一堆变量这样的非结构化数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多