Arrays 如何使用ruby提取和排序一个类的实例变量,这些变量存储在另一个类的实例变量内部的数组中?
在学习更多关于Ruby的知识时,我现在遇到了麻烦。我试图提取并排序一个类的实例变量的值,该值存储在另一个类的实例变量内的数组中。我似乎只能获取类本身的实例,而不是类中的特定实例变量 下面是两门课 product.rbArrays 如何使用ruby提取和排序一个类的实例变量,这些变量存储在另一个类的实例变量内部的数组中?,arrays,ruby,sorting,instance,instance-variables,Arrays,Ruby,Sorting,Instance,Instance Variables,在学习更多关于Ruby的知识时,我现在遇到了麻烦。我试图提取并排序一个类的实例变量的值,该值存储在另一个类的实例变量内的数组中。我似乎只能获取类本身的实例,而不是类中的特定实例变量 下面是两门课 product.rb class Product attr_reader :name, :price def initialize(name, price) @name = name @price = price end end class C
class Product
attr_reader :name,
:price
def initialize(name, price)
@name = name
@price = price
end
end
class Catalogue
attr_reader :contents
def initialize
@contents = []
end
def cheapest
@contents.product.first
end
def <<(product)
@contents << product
end
end
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
目录.rb
class Product
attr_reader :name,
:price
def initialize(name, price)
@name = name
@price = price
end
end
class Catalogue
attr_reader :contents
def initialize
@contents = []
end
def cheapest
@contents.product.first
end
def <<(product)
@contents << product
end
end
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>]
故障:
目录测试(catalogetest)#测试(test)(其中最便宜的)[catalogetest.rb:16]:
---期望
+++实际的
@@ -1 +1 @@
-“剪刀”
+[#]
理想情况下,我希望能够根据多个实例的价格对产品进行提取和排序。我意识到我需要进一步扩展现有代码,以确保我获取的是最便宜的(当数组中有多个对象时),但我只是尝试从一个基本函数开始访问其中的元素
到目前为止,我已经尝试了一些不同的方法,比如
sort
和first
,但是,我无法超越上面的输出,[#]
,深入到实例变量 我认为您的测试将使用以下方法定义:
def cheapest
@contents.sort_by(&:price).reverse.first.name
end
或者
def cheapest
@contents.sort_by { |product| produce.price * -1 }.first.name
end
当前,您正在尝试调用
@contents.product
,而实际调用的不是您想要的 我认为您的测试将使用以下方法定义:
def cheapest
@contents.sort_by(&:price).reverse.first.name
end
或者
def cheapest
@contents.sort_by { |product| produce.price * -1 }.first.name
end
当前,您正在尝试调用
@contents.product
,而实际调用的不是您想要的 在你的问题中,你会问:
我需要在catalog.rb
中添加什么才能使test\u成为catalog\u test.rb中最便宜的一个
但是,这个问题问错了!正如我在中提到的,您的问题是,在您的测试中,产品
是否等于字符串
,这永远不会是真的
,因为产品永远不会等于字符串。一个乘积只能等于一个乘积,一个字符串只能等于一个字符串
因此,问题在于测试,而不是生产代码
如果要修改生产代码,则必须更改cheapest
方法以返回最便宜产品的名称。但这是错误的。它应该退回最便宜的产品。如果它返回名称,则对您没有帮助,因为您无法使用该名称。例如,你无法打印出最便宜的产品的价格,因为你不知道最便宜的产品是什么,你只知道它叫什么
正确的解决方案是修改测试,以便测试返回的是正确的产品,而不是名称:
def测试是其中最便宜的
catalog=catalog.new
剪刀=新产品(“剪刀”,8)
目录在你的问题中,你会问:
我需要在catalog.rb
中添加什么才能使test\u成为catalog\u test.rb中最便宜的一个
但是,这个问题问错了!正如我在中提到的,您的问题是,在您的测试中,产品
是否等于字符串
,这永远不会是真的
,因为产品永远不会等于字符串。一个乘积只能等于一个乘积,一个字符串只能等于一个字符串
因此,问题在于测试,而不是生产代码
如果要修改生产代码,则必须更改cheapest
方法以返回最便宜产品的名称。但这是错误的。它应该退回最便宜的产品。如果它返回名称,则对您没有帮助,因为您无法使用该名称。例如,你无法打印出最便宜的产品的价格,因为你不知道最便宜的产品是什么,你只知道它叫什么
正确的解决方案是修改测试,以便测试返回的是正确的产品,而不是名称:
def测试是其中最便宜的
catalog=catalog.new
剪刀=新产品(“剪刀”,8)
在测试中,您正在测试产品
是否等于字符串
。显然,产品
永远不会等于字符串
。产品
将仅等于产品
,字符串
将仅等于字符串
。感谢您的帮助。是的,我们认为需要修改最便宜的
方法,以便从[#]
中获得“剪刀”。为了清楚起见,您尝试在类的实例上使用getter方法,而不是尝试读取其实例变量。如果您试图读取实例变量,这将是一个不正确封装的问题。Getter方法可以选择公开实例变量,但不必公开。@Anotherh感谢您的澄清。我不确定应该尝试使用什么方法。在您的测试中,您正在测试产品
是否等于字符串
。显然,产品
永远不会等于字符串
。产品
将仅等于产品
,字符串
将仅等于字符串
。感谢您的帮助。是的,我们认为需要修改最便宜的
方法,以便从[#]
中获得“剪刀”。为了清楚起见,您尝试在类的实例上使用getter方法,而不是尝试读取其实例变量。如果您试图读取实例变量,这将是一个不正确封装的问题。Getter方法可以选择公开实例变量,但不公开