Ruby - 如何将数据添加到嵌套数组中?
Ruby - How do you add data into a nested array?
我是 Ruby 的新手,我正在尝试设计一个有助于我工作的代码。
我想让代码做的是允许用户输入从星期一开始的一周中的每一天的“发票编号”,然后当用户输入完发票编号后,程序应该询问如何每天工作很多小时。然后,我想让程序将工作时间除以每天输入的发票数量,并以如下格式输出“计费时间”:
假设星期一工作了 10 个小时并且您输入了发票 #123 和 #124
程序应该输出如下-
Monday
#123 - 5 Hours
#124 - 5 Hours
但我希望一周中的每一天都发生这种情况。我假设我需要使用嵌套数组,但我只是对如何从用户添加条目以及让程序知道何时“移动”到第二天添加下一组感到困惑条目数。
这是我目前的代码:
days = ["Mon","Tue","Wed","Thurs","Fri","Sat","Sun"]
entry = Array.new
days.each do |day|
while entry != "ok"
puts "Enter PR # for " + day
puts "/n Type 'ok' when finished"
entry.each do |input|
input << gets.to_s.chomp
end
end
end
本质上,我只想让程序通过键入“ok”或其他内容来识别用户已完成当天的条目输入,以便它可以从星期一移动到星期二,等等。
在一个完美的世界中...在序列的末尾,我希望程序将每天所有名称相似的发票编号的值组合成一个结果(即,如果发票 #123 在星期一应用和星期二,程序会将这两天的计费小时数相加,并将结果输出为总计费金额。)
预先感谢您对此提供的任何帮助,因为随之而来的知识将受到深深的重视!!
嘿 – 给你 –> https://gist.github.com/Oluwadamilareolusakin/4f147e2149aa97266cfbb17c5c118fbf
为您整理了一个可能对您有帮助的要点,让我知道!
注意:小心 while true
以免 运行 陷入无限循环
这里是为了方便参考:
# frozen_string_literal: true
def display_billable_hours(entries)
entries.each do |key, value|
puts "#{key}:"
puts value
end
end
def handle_input
days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
entries = {}
days.each do |day|
loop do
p "Enter your invoice number for #{day}:"
invoice_number = gets.chomp
break if invoice_number.length > 0
end
loop do
p "How many hours did you work on #{day}?:"
hours_worked = gets.chomp
break if hours_worked.length > 0
end
entries[day] = "##{invoice_number} - #{hours_worked} Hours"
end
entries
end
def do_audit
entries = handle_input
display_billable_hours(entries)
end
do_audit
您可以通过以下方式收集所需信息。
DAYS = ["Mon", "Tue", "Wed", "Thurs", "Fri", "Sat", "Sun"]
def invoices_by_day
DAYS.each_with_object({}) do |day, inv_by_day|
prs = []
loop do
puts "Enter PR # for #{day}. Press ENTER when finished"
pr = gets.chomp
break if pr.empty?
prs << pr
end
hours =
if prs.any?
puts "Enter hours worked on #{day}"
gets.to_f
else
0
end
inv_by_day[day] = { prs: prs, hours: hours }
end
end
假设
h = invoices_by_day
#=> { "Mon"=>{ prs: ["123", "124"], hours: 21.05 },
# "Tue"=>{ prs: ["125"], hours: 31.42 },
# "Wed"=>{ prs: ["126", "127"], hours: 68.42 },
# "Thu"=>{ prs: ["128"], hours: 31.05 },
# "Fri"=>{ prs: [], hours: 0 },
# "Sat"=>{ prs: ["129", "130"], hours: 16.71 }
# "Sun"=>{ prs: ["131"], hours: 55.92 } }
然后您可以通过多种方式显示此信息,例如以下。
h.each do |day, g|
puts day
if g[:prs].empty?
puts " No invoices"
else
avg = (g[:hours]/g[:prs].size).round(2)
g[:prs].each { |pr| puts " ##{pr}: #{avg}" }
end
end
Mon
#123: 10.53
#124: 10.53
Tue
#125: 31.42
Wed
#126: 34.21
#127: 34.21
Thurs
#128: 31.05
Fri
No invoices
Sat
#129: 8.36
#130: 8.36
Sun
#131: 55.92
通常,将数据收集与数据处理和结果呈现分开是一种很好的做法。这使得以后更改任何一个都更容易。
几乎所有循环我都使用 Kernel#loop 和 break
。 loop
的一个优点是使用块(不同于 while
和 until
),将在块内创建的局部变量的范围限制在块内。另一个优点是它通过跳出循环来处理 StopIteration
异常。当枚举器尝试生成超出其最后一个值的元素时,会引发该异常。例如,如果 e = 3.times #=> #<Enumerator: 3:times>
,则 e.next #=> 0
,e.next #=> 1
e.next #=> 2
,e.next #=> StopIteration
。
我是 Ruby 的新手,我正在尝试设计一个有助于我工作的代码。
我想让代码做的是允许用户输入从星期一开始的一周中的每一天的“发票编号”,然后当用户输入完发票编号后,程序应该询问如何每天工作很多小时。然后,我想让程序将工作时间除以每天输入的发票数量,并以如下格式输出“计费时间”:
假设星期一工作了 10 个小时并且您输入了发票 #123 和 #124
程序应该输出如下-
Monday
#123 - 5 Hours
#124 - 5 Hours
但我希望一周中的每一天都发生这种情况。我假设我需要使用嵌套数组,但我只是对如何从用户添加条目以及让程序知道何时“移动”到第二天添加下一组感到困惑条目数。
这是我目前的代码:
days = ["Mon","Tue","Wed","Thurs","Fri","Sat","Sun"]
entry = Array.new
days.each do |day|
while entry != "ok"
puts "Enter PR # for " + day
puts "/n Type 'ok' when finished"
entry.each do |input|
input << gets.to_s.chomp
end
end
end
本质上,我只想让程序通过键入“ok”或其他内容来识别用户已完成当天的条目输入,以便它可以从星期一移动到星期二,等等。
在一个完美的世界中...在序列的末尾,我希望程序将每天所有名称相似的发票编号的值组合成一个结果(即,如果发票 #123 在星期一应用和星期二,程序会将这两天的计费小时数相加,并将结果输出为总计费金额。)
预先感谢您对此提供的任何帮助,因为随之而来的知识将受到深深的重视!!
嘿 – 给你 –> https://gist.github.com/Oluwadamilareolusakin/4f147e2149aa97266cfbb17c5c118fbf
为您整理了一个可能对您有帮助的要点,让我知道!
注意:小心 while true
以免 运行 陷入无限循环
这里是为了方便参考:
# frozen_string_literal: true
def display_billable_hours(entries)
entries.each do |key, value|
puts "#{key}:"
puts value
end
end
def handle_input
days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
entries = {}
days.each do |day|
loop do
p "Enter your invoice number for #{day}:"
invoice_number = gets.chomp
break if invoice_number.length > 0
end
loop do
p "How many hours did you work on #{day}?:"
hours_worked = gets.chomp
break if hours_worked.length > 0
end
entries[day] = "##{invoice_number} - #{hours_worked} Hours"
end
entries
end
def do_audit
entries = handle_input
display_billable_hours(entries)
end
do_audit
您可以通过以下方式收集所需信息。
DAYS = ["Mon", "Tue", "Wed", "Thurs", "Fri", "Sat", "Sun"]
def invoices_by_day
DAYS.each_with_object({}) do |day, inv_by_day|
prs = []
loop do
puts "Enter PR # for #{day}. Press ENTER when finished"
pr = gets.chomp
break if pr.empty?
prs << pr
end
hours =
if prs.any?
puts "Enter hours worked on #{day}"
gets.to_f
else
0
end
inv_by_day[day] = { prs: prs, hours: hours }
end
end
假设
h = invoices_by_day
#=> { "Mon"=>{ prs: ["123", "124"], hours: 21.05 },
# "Tue"=>{ prs: ["125"], hours: 31.42 },
# "Wed"=>{ prs: ["126", "127"], hours: 68.42 },
# "Thu"=>{ prs: ["128"], hours: 31.05 },
# "Fri"=>{ prs: [], hours: 0 },
# "Sat"=>{ prs: ["129", "130"], hours: 16.71 }
# "Sun"=>{ prs: ["131"], hours: 55.92 } }
然后您可以通过多种方式显示此信息,例如以下。
h.each do |day, g|
puts day
if g[:prs].empty?
puts " No invoices"
else
avg = (g[:hours]/g[:prs].size).round(2)
g[:prs].each { |pr| puts " ##{pr}: #{avg}" }
end
end
Mon
#123: 10.53
#124: 10.53
Tue
#125: 31.42
Wed
#126: 34.21
#127: 34.21
Thurs
#128: 31.05
Fri
No invoices
Sat
#129: 8.36
#130: 8.36
Sun
#131: 55.92
通常,将数据收集与数据处理和结果呈现分开是一种很好的做法。这使得以后更改任何一个都更容易。
几乎所有循环我都使用 Kernel#loop 和 break
。 loop
的一个优点是使用块(不同于 while
和 until
),将在块内创建的局部变量的范围限制在块内。另一个优点是它通过跳出循环来处理 StopIteration
异常。当枚举器尝试生成超出其最后一个值的元素时,会引发该异常。例如,如果 e = 3.times #=> #<Enumerator: 3:times>
,则 e.next #=> 0
,e.next #=> 1
e.next #=> 2
,e.next #=> StopIteration
。