从循环散列中删除最后一个字符



你能用这段代码帮我解决这个问题吗?

total_user_input = []
while true
print "Field Name: "
user_input = gets.chomp
break if user_input.empty?
total_user_input << user_input
end

total_user_input.each do |input|
aa = input.split(":").reduce {|first, second| "  t'#{first}': '#{second}',rn".gsub("'",'"') }
puts aa.chomp(',')
end

和结果

"name": "string",
"desc": "string",
"price": "integer",

但是我想去掉最后一个逗号,只写

"name": "string",
"desc": "string",
"price": "integer"

谢谢你的帮助

我不知道你的实际情况,但我基于你的期望,你可以试试。

total_user_input = [
"name:test",
"age:30"
]
input_length = total_user_input.size
total_user_input.each_with_index do |input, index|
aa = input.split(":").reduce {|first, second| "  t'#{first}': '#{second}',rn".gsub("'",'"') }
aa = aa.gsub(',', '') if index == input_length - 1 # or aa.slice(-1)
puts aa
end

=比;我的结果

"name": "test",
"age": "30"

TL;DR

我很高兴回答你的问题,但需要指出的是,你所做的本质上是一个反模式,而不是惯用的Ruby。

我将首先向您展示一种更好的方法来完成您正在做的事情,使用转换阶段而不是单一的惯用方法链。接下来,我将介绍一些可以帮助您处理已经构造好的String数据的替代方法。

最后,我还提供了一些您应该注意的注意事项,但这些注意事项对于回答您的问题并不重要。它们仍然很有用,当你试图调试某些东西时,它们肯定会帮助你解决这类问题。

正确的方式

首先,如果你能避免,不要做你正在做的事。解决这样的问题会导致非常脆弱的解决方案。相反,只需将输入对直接转换为Hash或JSON即可。例如:

require "json"
pp total_user_input
#=> ["name", "string", "desc", "string", "price", "integer"]
aa = total_user_input.each_slice(2).to_h
#=> {"name"=>"string", "desc"=>"string", "price"=>"integer"}
puts JSON.pretty_generate aa
{
"name": "string",
"desc": "string",
"price": "integer"
}

在阶段,这将改变您的输入和打印一个字符串发送到STDOUT适合写入一个文件或者打印格式为JSON。

你原来的问题得到了回答

如果您坚持要修改给定的String,我们将首先将其表示为here-document。

your_pseudo_json = <<~STRING
"name": "string",
"desc": "string",
"price": "integer",
STRING

对于这个给定的字符串,你有有限的选项。使用windows风格的换行符而不是unix风格的换行符也会使您的生活变得复杂,但是您可以通过以下两种方式之一来处理:

  1. 为您的系统使用$/record分隔符,可能是默认定义的,或者您自己设置。然后你可以使用string# chomp。例如:

    # If you have to set it explicitly, do so by assigning to $/
    # NB: You may not. I don't have a Windows system to check.
    $/ = "rn"
    your_pseudo_json.chomp!(",#{$/}")
    
  2. 使用锚定正则表达式只删除末尾的项。不管你的平台的行尾是什么,这都可以工作。例如:

    your_pseudo_json.sub! /,(?:r?n)z/, ""
    
  3. 如果你运行的是支持String#delete_suffix!那么你就可以像#chomp一样做这件事,但是用一个简单的字符串,没有插值。例如:

    # for Windows line endings
    your_pseudo_json.delete_suffix! ",rn"
    # for *nix-style line endings
    your_pseudo_json.delete_suffix! ",n"
    

警告

使用非bang方法检测Irb或Pry

作为测试注意事项,在您的REPL中使用#chomp、#sub和#delete_suffix等非bang方法进行测试,这样您就不必在进行实验时不断重新创建字符串。bang方法会就地修改你的字符串,除非你在运行时默认启用了冻结字符串。

冷冻字符串

另外,注意如果你在程序中使用冻结字符串编译,例如:

  • # frozen_string_literal: true在你的。rb文件的顶部
  • 当调用REPL时,环境中的
  • RUBYOPT="--enable-frozen-string-literal"

则使用非bang方法并将结果赋值给不同的(甚至相同的)变量。复制冻结字符串的未冻结副本超出了您当前问题的范围,所以我甚至根本不会提及它,除非是为了防止其他读者对这个主题的普遍看法。:)

最新更新