Ruby:方法未返回预期的输出

时间:2019-10-11 10:27:04

标签: arrays ruby class

我正在尝试创建一个模拟商店结帐的程序。但是,我的 async filteredServices ({ commit, dispatch }, form) { const url = 'test/service/' + '?city_id=' + form.cityId + '&sub_category=' + form.subCat + '&car__car_model=' + form.car + '&limit=' + form.limit + '&offset=' + form.offset const response = await dispatch('api/test/get', { url }, { root: true }) if (response.status === 200) { commit('setCompanyService', response.data.results) console.log('setCompanyService', response.data.results) } }, 方法返回类变量applyFilter () { this.filteredServices({ cityId: this.selectedCityId, car: '', subCat: 3360, limit: '', offset: '' }) } ,而不仅仅是返回其找到的单数。这样,一旦添加了所有项目,便可以显示这些项目的总数。

AddItem

4 个答案:

答案 0 :(得分:2)

最好使用find方法:

def AddItem(item)
  @item.find{ |x| x[:name] == item }
end

更新

在红宝石中,snake_case是首选。我已经用ruby方法编辑了代码。

class Action
  def initialize(customer_money)
    @money = customer_money
    @items = [{ name: :milk, price: 2.99 }, { name: :eggs, price: 1.50 }, { name: :bread, price: 2.00 }]
  end

  def check_price(item)
    @items.find{ |x| x[:name] == :bread }[:price]
  end

  def add_item(item)
    @items.find{ |x| x[:name] == item }
  end

  def check_total(basket)
    puts basket.sum{ |x| x[:price] }
  end
end

答案 1 :(得分:1)

Ruby始终返回在方法中求值的表达式的结果。如果是class FileIdType extends Type { public function convertToDatabaseValue($value, AbstractPlatform $platform) { return new FileId($value); } } ,则为AddItemeach返回正在枚举的整个集合。您需要添加一个found元素作为方法的最后一行:

Enumerable#each

顺便说一句。在ruby中,方法用 def AddItem(item) i = 0 found = nil @item.each do |x| if x[:name] == item found = x end end found # <<<<<<<<< returning found end 而不是snake_case命名。此外,CamelCase是实例(不是类)变量。

您可以对@item做同样的事情:

find

as def AddItem(item) @item.find do |x| x[:name] == item end end 返回该数组返回真实值的数组元素

答案 2 :(得分:0)

在Ruby中,将自动返回方法中定义的最后一个变量。由于您最后定义的是@item,因此您将获得成功。问题是您正在遍历@item,但没有对结果做任何事情,因此@item保持不变。

假设@item实际上应该是复数@items ?,我想您实际上想做的是使用select而不是每个。

def AddItem(item)
  @items.select {|x| x[:name] === item}
end

这将返回从x[:name] === item

返回true的项目数组

然后,方法AddItem的名称并不能真正代表该方法的实际作用,但这又是另一回事了:)

答案 3 :(得分:0)

如果您不是明确地 return来自某个方法的内容(或next来自某个块的内容),则最后计算的表达式将变为方法的返回值(块,lambda,模块定义主体,类定义主体)。

由于您不要return中显式AddItem,所以最后一个被求值的表达式将是返回值。最后计算的表达式是:

@item.each do |x|
  if x[:name] == item
    x
  end
end

换句话说,AddItem的返回值将是@item.each的返回值。根据{{​​3}},返回值就是调用Array的{​​{1}}。 (请注意,这实际上并非特定于each,它是Array#each一般合同,因此对于{em的 all 所有实现{1}}。)

这很有道理:each的目的是对集合的每个元素执行副作用。它实际上并没有有用的返回值。因此,两个明智的返回值分别为eacheach,而库设计人员选择了nil。 (大概是为了允许方法链接,我不知道。)

下一个问题是您的块实际上不执行任何操作。请记住,self的目的是对每个元素执行一个副作用,但是您的块没有任何副作用!如果您想做任何有用的事情,则需要一个副作用(例如修改外部变量绑定):

self

或者,您可以直接each找到的项目:

def AddItem(item)
  return_value = nil

  @item.each do |el|
    return_value = el if el[:name] == item
  end

  return_value
end

但是,实际上,您要做的就是找到第一个匹配项:

return

请注意,您的代码有很多令人困惑的地方:

  • 您有两种方法都名为def AddItem(item) @item.each do |el| return el if el[:name] == item end end ,但是这两种方法做的事情完全不同。
  • 此外,这两种方法均未检查任何东西,一个方法打印了东西,另一个找到了东西。
  • 您的方法def AddItem(item) @item.find {|el| el[:name] == item } end CheckSomething的功能完全相同,但是其名称完全不同。而且,它以完全不同的方式处理事情。 (这就是为什么它不起作用的原因。)
  • 再次命名:AddItem实际上并没有添加任何内容。
  • 此外,CheckPriceAddItem中做什么?
  • 该类被命名为i = 0,这是一个非常通用的名称,并没有说明它在做什么。
  • 不过,它似乎并没有做很多事情。
  • 实例化AddItem时,将其分配给名为Action的变量。但是,似乎也没有太多“定制”的事情。
  • 最后,您将客户放入了一个篮子。试想一下,这是一个真实世界的超市。这就是它在现实世界中的运作方式吗?

最后一句话:标准的Ruby Community Coding Style将Action用于方法,局部变量,实例变量,类变量和全局变量。 customer用于指向类或模块的常量,snake_case用于指向其他常量。我们不使用PascalCase