Ruby:存储信息的哈希、数组和对象

Ruby: Hash, Arrays and Objects for storage information

我正在学习 Ruby,读了一些书、教程、论坛等等...所以,我对此是全新的。 我正在尝试开发一个库存系统,以便我可以学习做事。 我的问题如下:

我创建了以下内容来存储交易:(只是代码的几部分)

transactions.push type: "BUY", date: Date.strptime(date.to_s, '%d/%m/%Y'), quantity: quantity, price: price.to_money(:BRL), fees: fees.to_money(:BRL)

一位同事 建议创建一个事务 class 来存储它。 因此,对于我拥有的下一个存储信息,我做了:

@dividends_from_stock << DividendsFromStock.new(row["Approved"], row["Value"], row["Type"], row["Last Day With"], row["Payment Day"])

现在,第一个问题:哪种方式更好?数组中的散列还是数组中的对象?为什么?

这个@dividends_from_stock是由方法'dividends'返回的。

我想查找在特定日期之前支付的所有股息:

puts ciel3.dividends.find_all {|dividend| Date.parse(dividend.last_day_with) >  Date.parse('12/05/2014')}

我得到以下信息:

#<DividendsFromStock:0x2785e60>
#<DividendsFromStock:0x2785410>
#<DividendsFromStock:0x2784a68>
#<DividendsFromStock:0x27840c0>
#<DividendsFromStock:0x1ec91f8>
#<DividendsFromStock:0x2797ce0>
#<DividendsFromStock:0x2797338>
#<DividendsFromStock:0x2796990>

好的,我能够发现(我认为)所有日期早于 12/05/2014 的对象。但是(第二个问题)我怎样才能获得有关存储在对象中的 'value'(或其他信息)的信息?

您可能需要某种第一个 class 模型来表示 trade/transaction 的概念和用作分类帐的交易列表。

我建议为此更接近数据库,而不是操纵内存中的玩具对象。 Sequel can be a pretty simple ORM if used minimally, but ActiveRecord 通常对初学者更友好,锐角更少。

使用裸散列或数组有利于制作原型并查看原则上是否可行。除此之外,提供适当的东西也很重要 classes 这样你就可以正确地将它们联系起来并开始改进这些东西如何组合在一起。

我什至会从 TransactionHistory 开始,它是从 Array 派生的 class,您可以免费获得所有这些功能,然后可以根据需要添加自定义内容。

例如,您有一个非常粗糙的 DividendsFromStock 接口,可以通过 row 的格式按原样被 initialize 函数接受来清理。

不要忘记为您希望能够打印或查看的任何自定义 class 编写 to_sinspect 方法。这些通常编写起来非常简单,在调试时非常方便。

  1. 通常最好定义 classes。 类 有名字。当您的程序变大时,它们将帮助您了解正在发生的事情。您总是可以看到每个变量的 class,如下所示:var.class。如果你到处都使用散列,你会感到困惑,因为这些调用总是 return Hash。但是,如果您为事物定义 classes,您将看到您的 class 个名称。
  2. 在您的 classes 中定义方法,return 您需要的信息。如果您定义了一个名为 to_s 的方法,Ruby 将在您打印对象或在插值中使用它时在对象的幕后调用它 (puts "Some #{var} here")。

谢谢!

我将根据 tadman 和 Ilya Vassilevsky(以及 B. Seven)提供的信息回答我的问题。

1- 最好创建一个 class 和对象。它将帮助我组织代码和调试。本地化谁是谁,在做什么。与 DB 一起使用似乎也更好。

2- 找出解决方案后,我对我的问题感到有点羞愧。这比我想的要简单得多。只需两步:

willpay =  ciel3.dividends.find_all {|dividend| Date.parse(dividend.last_day_with) >  Date.parse('10/09/2015')}

willpay.each do |dividend| 
puts "#{ciel3.code} has approved #{dividend.type} on #{dividend.approved} and will pay by #{dividend.payment_day} the value of #{dividend.value.format} per share, for those that had the asset on #{dividend.last_day_with}"
puts
end