【问题标题】:Problems with Ruby one? and include? methods红宝石一号有问题吗?并包括?方法
【发布时间】:2021-08-28 01:04:19
【问题描述】:

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? 获取一个数组,然后仅当它包含单词 coffeeespresso 时才返回 true。 我使用以下内容返回预期:drink_list.include?("coffee" || "espresso") 但是当我的列表中有espresso 而没有coffee 时,控制台会返回:

包含浓缩咖啡时返回 true (FAILED - 1)

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

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

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

数组在哪里

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


    【解决方案1】:

    您的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 }
    

    您也可以使用array decomposition:

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

    或者事先只检索values

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

    【讨论】:

    • 你也可以使用(drink_list & ["coffee", "espresso"]).any?
    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2010-11-26
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2016-05-16
    • 2021-07-08
    相关资源
    最近更新 更多