首页 > 解决方案 > 代码运行,只是不完全符合我的需要

问题描述

这是另一位社区成员慷慨帮助的代码。

require 'date'

today = Date.today


hires = [
  { name: 'Jerry', date: Date.new(2021, 8, 15) },
  { name: 'Berry', date: Date.new(2021, 8, 13) },
  { name: 'Jack', date: Date.new(2021, 8, 19) }
]


def report(hires, today)
  hires.each do |hire|
    puts(
      format(
        '%s , needs vacation',
        hire[:name],
        hire[:date],
        today - hire[:date]
      )
    )
  end
end
report(hires,today)

此代码将输出

Jerry was hired on 2021-05-13, which is X days ago
Berry was hired on 2021-05-06, which is X days ago # The X's are examples :)
Jack was hired on 2021-05-17, which is X days ago

基本上我想做的是运行代码,它只显示从今天开始 91-97 天前被雇用的人,并输出他们的名字。所以他们的输出最好是发布类似的东西。

Jerry, needs vacation
Berry, needs vacation
# it would only say Jerry and Berry Because Jack had not rolled over yet.

谢谢您的帮助!

标签: ruby

解决方案


您可以对数组使用“选择”枚举器

https://ruby-doc.org/core-3.0.2/Enumerable.html#method-i-select

require 'date'

VACATION_INTERVAL = (91..97).freeze

hires = [
  { name: 'Jerry', date: Date.new(2021, 8, 15) },
  { name: 'Berry', date: Date.new(2021, 8, 13) },
  { name: 'Jack', date: Date.new(2021, 8, 19) }
]

def report(hires, today)
  hires = hires.select do |hire|
    # Do not use "!" after select
    # Unless you want to keep the variable value after method's run
    day_interval = (today - hire[:date]).to_i # The default return is Rational

    VACATION_INTERVAL.include?(day_interval)
  end

  hires.each { |hire| puts(format('%s, needs vacation', hire[:name])) }
end

today = Date.today

由于这取决于您的代码上下文,我只是添加了“选择”行,并删除了您的“格式”方法未使用的行


我更改了您的“雇用”变量以匹配从今天开始的 91 到 97 天的间隔,为您提供以下示例(因为今天,8 月 17 日,与您的示例不匹配);

hires = [
  { name: 'Jerry', date: Date.new(2021, 8, 15) },
  { name: 'Berry', date: Date.new(2021, 5, 14) },
  { name: 'Jack', date: Date.new(2021, 5, 16) }
]

并执行

report(hires,today)

输出;

Berry, needs vacation
Jack, needs vacation

但是该方法仍然返回数组,所以要小心


推荐阅读