首页 > 解决方案 > 红宝石一号有问题吗?并包括?方法

问题描述

MCVE(最小,完整,可验证的示例)为了重现与我相同的问题:

在 rspec 文件位置:

RSpec.describe 'Predicate Enumerable Exercises' do

  describe 'coffee drink exercise' do
    it 'returns true when espresso is included' do
      drink_list = ["milk", "juice", "espresso"]
      expect(coffee_drink?(drink_list)).to be true
    end
  end

  describe 'valid scores exercise' do
    it 'returns true when only one score is a 10' do
      score_list = { easy_to_read: 10, uses_best_practices: 8, clever: 7 }
      perfect_score = 10
      expect(valid_scores?(score_list, perfect_score)).to be true
    end 
  end

end

在实际功能文件中:

def coffee_drink?(drink_list)
  drink_list.include?("coffee" || "espresso")
end

def valid_scores?(score_list, perfect_score)
  score_list.one?{|score| score == perfect_score}
end

我很难弄清楚我的代码有什么问题,因为我依赖于内置方法(一个?,包括?)所以我不确定实际问题是什么

我创建了 2 个方法,coffee_drink?(drink_list)并且valid_scores?(score_list, perfect_score).

coffee_drink?获取一个数组,然后仅当它包含单词coffee或时才返回 true espresso。我使用以下内容返回预期:drink_list.include?("coffee" || "espresso") 但是当我espresso在我的列表中并且没有coffee控制台返回时:

包含 espresso 时返回 true (FAILED - 1)

drink_list在哪里["milk", "juice", "espresso"]

因为valid_scores?它获取一个数组和一个整数,并且当数组中只有一个值等于该整数时返回 true。但我希望score_list.one?{|score| score == perfect_score}当只有一个值为真时,它会返回真。相反,我得到:

当只有一个分数是 10 时返回 true (FAILED - 2)

数组在哪里

score_list = { easy_to_read: 10, uses_best_practices: 8, clever: 7 }

整数是

perfect_score = 10

如果有帮助,我正在使用 ruby​​ 2.7.2p137(2020-10-01 修订版 5445e04352)[x86_64-linux]。

标签: ruby

解决方案


您的include?代码行为与预期不同,因为:

"coffee" || "espresso" #=> "coffee"

# so
drink_list.include?("coffee" || "espresso")
# evaluates to
drink_list.include?("coffee")

您必须使用 2 个单独的include?调用,或者使用其他选项,例如any?or &

drink_list.include?("coffee") || drink_list.include?("espresso")
# or
drink_list.any? { |drink| drink == "coffee" || drink == "espresso" }
drink_list.any?(/\A(coffee|espresso)\z/)
(drink_list & ["coffee", "espresso"]).size.positive? # !(...).empty? also works

您的one?代码的行为与预期不同,因为score_list它不是数组,而是哈希(其他语言中的字典/映射)。散列由键/值对组成,它们作为数组 ( [key, value]) 传递给one?块。

score_list.one? { |pair| pair.last == perfect_score }

或者,您可以使用数组分解

score_list.one? { |key, value| value == perfect_score }

或者只检索values事先:

score_list.values.one? { |score| score == perfect_score  }

推荐阅读