Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何使用ruby提取和排序一个类的实例变量,这些变量存储在另一个类的实例变量内部的数组中?_Arrays_Ruby_Sorting_Instance_Instance Variables - Fatal编程技术网

Arrays 如何使用ruby提取和排序一个类的实例变量,这些变量存储在另一个类的实例变量内部的数组中?

Arrays 如何使用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

在学习更多关于Ruby的知识时,我现在遇到了麻烦。我试图提取并排序一个类的实例变量的值,该值存储在另一个类的实例变量内的数组中。我似乎只能获取类本身的实例,而不是类中的特定实例变量

下面是两门课

product.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
目录.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方法可以选择公开实例变量,但不公开