【问题标题】:Ruby: Hash, Arrays and Objects for storage informationRuby:用于存储信息的哈希、数组和对象
【发布时间】:2016-11-29 07:59:03
【问题描述】:

我正在学习 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)

一位同事here 建议创建一个事务类来存储它。 所以,对于我拥有的下一个存储信息,我做了:

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

现在,第一个问题:哪种方式更好?数组中的哈希或数组中的对象?为什么?

此@dividends_from_stock 由“股息”方法返回。

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

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>

好吧,我能够发现(我认为)日期高于 2014 年 12 月 5 日的所有对象。但是(第二个问题)我怎样才能获得有关存储在对象内的“价值”(或其他信息)的信息?

【问题讨论】:

  • 你为什么把两个问题放在一个 StackOverflow 问题中? :)
  • 这是一个非常好的问题!哈哈!对我来说,它们是相关的。 1- 如何存储信息,以及 2- 如何检索(导航)存储的信息。对于哈希,由于另一篇文章(原始问题的链接),我已经知道该怎么做。咳咳!

标签: arrays ruby object hash storage


【解决方案1】:

谢谢!

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

1- 最好创建一个类和对象。它将帮助我组织代码和调试。本地化谁是谁,做什么。似乎也更适合与 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

【讨论】:

    【解决方案2】:
    1. 通常最好定义类。类有名字。他们将帮助您了解当您的程序变大时发生了什么。您总是可以像这样看到每个变量的类:var.class。如果你到处使用哈希,你会感到困惑,因为这些调用总是返回Hash。但如果你为事物定义类,你会看到你的类名。
    2. 在类中定义返回所需信息的方法。如果您定义了一个名为 to_s 的方法,Ruby 将在您打印它或在插值中使用它时在对象的幕后调用它 (puts "Some #{var} here")。

    【讨论】:

    • 我应该在哪里写 def to_s ?我有一个Class Stock,它有一个方法dividends,它创建一个新的Class CsvReader,它有一个方法read_in_csv_data,它创建一个Class DividendsFromStock。而CsvReader 也有一个方法dividends_from_stock,它返回存储的@dividends_from_stock。这个def to_s 去哪儿了??我迷路了……
    • 您可以在每个类中定义to_s,您需要打印的实例:)
    【解决方案3】:

    您可能需要某种一流的模型来表示交易/交易的概念以及用作分类帐的交易列表。

    我建议为此转向更接近数据库,而不是在内存中操作玩具对象。 Sequel 可以是一个非常简单的 ORM,如果使用最少的话,但 ActiveRecord 通常对初学者更友好,而且锐利的边缘更少。

    使用裸散列或数组有利于原型设计并查看原理上是否可行。除此之外,为事物提供适当的类也很重要,这样您就可以正确地关联它们并开始改进这些事物如何组合在一起。

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

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

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

    【讨论】:

    • Tnks Tadman,我想我会做 TransactionHistory CSV.foreach(csv_file_name, headers: true) do |row| @dividends_from_stock << DividendsFromStock.new(row["Approved"], row["Value"], row["Type"], row["Last Day With"], row["Payment Day"]) end 我怎样才能让rowinitialize 接受?
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2014-05-29
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多