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
控制台返回时:
包含 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]。
解决方案
您的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 }
推荐阅读
- python - Django一次保存多个对象
- sql - 在 MSSQL 中转义单引号
- amazon-web-services - AWS Serverless:根据请求或 HTTP API 参数强制执行并行 lambda
- javascript - 使用 id React 将特定对象推入列表
- python - 使用 gunicorn + gevent 启动 Flask 应用程序,监听地址:http://127.0.0.1:8000,但没有响应
- sql - Spring Boot Autoimport import.sql 文件 - 出现“找不到列”错误
- java - 使用 Selenium-Java 在浏览器的正常 UI 模式下运行测试的 Headless chrome
- python - 使用“groupby”而不在组内进行聚合和排序
- r - 使用 R 从 LiDAR 点云制作漂亮的 GIF(使用 lidR 包?)
- php - 用 htaccess 重写图片 url