【发布时间】:2020-08-04 23:22:13
【问题描述】:
在了解更多关于 Ruby 的信息时,我遇到了困难。我正在尝试提取和排序一个类的实例变量的值,该值存储在另一个类的实例变量内的数组中。我似乎只能抓取类本身的实例,而不是类中的具体实例变量。
下面是两个类。
product.rb
class Product
attr_reader :name,
:price
def initialize(name, price)
@name = name
@price = price
end
end
catalogue.rb
class Catalogue
attr_reader :contents
def initialize
@contents = []
end
def cheapest
@contents.product.first
end
def <<(product)
@contents << product
end
end
以下测试确认我没有正确地提取和排序 @name 和 @price 的 Product 实例,存储在 @contents 实例中的 Catalogue 中。
catalogue_test.rb
gem 'minitest', '~> 5.2'
require 'minitest/autorun'
require 'minitest/pride'
require 'catalogue'
require 'product'
class CatalogueTest < Minitest::Test
def test_cheapest_of_one
catalogue = Catalogue.new
catalogue << Product.new('scissors', 8)
assert_equal 'scissors', catalogue.cheapest
end
end
这是失败:
Failure:
CatalogueTest#test_cheapest_of_one [catalogue_test.rb:16]:
--- expected
+++ actual
@@ -1 +1 @@
-"scissors"
+[#<Product:0xXXXXXX @name="scissors", @price=8>]
理想情况下,我希望能够在多个实例中根据价格提取和分类产品。我意识到我需要进一步扩展现有代码以确保我获得最便宜的(当数组中有多个对象时),但只是尝试从一个基本函数开始访问其中的元素。
到目前为止,我已经尝试了一些不同的方法,例如 sort 和 first,但是,我无法超越上述输出 [#<Product:0xXXXXXX @name="scissors", @price=8>],并深入研究实例变量。 ????♂️
我需要在catalogue.rb 中添加什么才能使catalogue_test.rb 中的test_cheapest_of_one 通过?
【问题讨论】:
-
在您的测试中,您正在测试
Product是否等于String。显然,Product永远不会等于String。Product将仅等于Product,String将仅等于String。 -
感谢您帮助我。是的,正在考虑需要修改
cheapest方法以从[#<Product:0xXXXXXX @name="scissors", @price=8>]中抓取“剪刀”。 -
为了清楚起见,您尝试在类的实例上使用 getter 方法,而不是尝试读取其实例变量。如果您试图读取实例变量,那将是封装不当的问题。 Getter 方法可以选择公开实例变量,但不是必须的。
-
@anothermh 感谢您的澄清。我不确定我应该尝试使用什么方法。
标签: arrays ruby sorting instance instance-variables