Ruby 有问题吗?并包括?方法

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控制台返回时:

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

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

数组在哪里

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]。

回答

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

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

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

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  }

以上是Ruby 有问题吗?并包括?方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>