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 }