实施包括?建立 Ruby 杂货清单

Implementing Include? to build Ruby Grocery List

刚开始学习 Ruby,我正在尝试了解如何使用 .include? 构建一个Ruby 的杂货清单。具体来说,我的方法需要使用 2x 个参数,第一个 = 要添加的项目,第二个 = 杂货清单的数组。该方法需要向列表中添加新项目,并且还需要识别项目是否已包含在列表中。

def add_item!(item, list)
  if [list].include?(item) == false
    list << item
  else [list].include?(item) == true
    list
  end
end

这是测试代码的 TDD:

describe "add_item!" do
  it "adds an item to the end of the list" do
    expect( add_item!("banana", ["orange"]) ).to eq(["orange", "banana"])
  end
  it "doesn't add an item if the list already has it" do
    expect( add_item!("orange", ["orange"]) ).to eq(["orange"])
  end
end

我的代码正在返回 ["orange", "banana"] 在第一次测试中,但是 ["orange", "orange"] 在第二次测试中。

我知道这是一个简单的挑战,但我不明白我是否使用了 .include?正确。

除了括号外,它看起来还不错。你不应该需要那些。此外,没有理由调用 list 或使用 else。

def add_item!(item, list)
  if list.include?(item) == false
    list << item
  end
end

进一步审查,您为什么要通过 [orange]?您的方法将列表定义为您要查找的值。你不想通过列表吗?

list = []

add_item!("orange", list)
add_item!("bananna", list)

问题是,如果用方括号将数组括起来,它就会变成数组的数组。因此 include? 将 return false:

[['orange']].include('orange') # => false

这里有一个缩短代码的提示:

def add_item(item, list)
  list.include?(item) ? list : list << item
end

您不需要使用括号。如果您已经将数组定义为变量,则只需使用它的名称即可。例如列表 = ["oranges", "bananas"]。 Ruby 已经知道列表是一个包含这些项目的数组,所以当您调用函数时:

def add_item!(item, list)
   unless list.include?(item)
    list << item
   else
    puts "Item already on the list"
   end
  end

这样代码看起来就不那么混乱了。 "Unless" 类似于 "IF" 语句,但它已经检查语句是否为假。在这个例子中,它检查列表是否已经包含项目,如果是(真),它跳到 "else",如果它为假(项目不在列表中)它运行代码,因此将项目添加到列表中。

总的来说一切都很好,只是去掉括号。

我也在学习Ruby,这是一门很棒的语言,祝你好运,不要放弃。