-2

このコードでこの問題を解決するのを手伝ってもらえますか?

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}',\r\n".gsub("'",'"') }
  puts aa.chomp(',')
end

そして私が得る結果

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

しかし、私が欲しいのは、最後のコンマだけを削除することです

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

助けてくれてありがとう

4

2 に答える 2

0

TL;DR

あなたが実際に尋ねた質問に喜んでお答えしますが、あなたがしていることは本質的にアンチパターンであり、慣用的な Ruby ではないことを指摘する必要があります。

最初に、単一の慣用的なメソッド チェーンではなく、段階的な変換を使用して、現在行っていることを行うためのより良い方法を示します。次に、作成済みの String データを処理するのに役立ついくつかの代替手段について説明します。

最後に、一般的に知っておくべきいくつかの注意事項を示しますが、質問への回答には必須ではありません。それらは依然として有用であり、何かをデバッグしようとしているときに、この種の問題に対処するのに間違いなく役立ちます。

正しい道

まず第一に、あなたがそれを避けることができるなら、あなたがしていることをしないでください. そのように問題を解決すると、非常に脆弱な解決策につながります。代わりに、入力のペアを取得して、ハッシュまたは 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"
}

これにより、入力が段階的に変換され、ファイルへの書き込みや JSON としての整形出力に適した STDOUT に文字列が出力されます。

元の質問への回答

与えられた文字列を変更しようとする場合は、ヒアドキュメントとして表現することから始めます。

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

この指定された文字列のオプションは限られています。また、Unix スタイルの代わりに Windows スタイルの改行を使用することで生活が複雑になりますが、次の 2 つの方法のいずれかでこれを処理できます。

  1. おそらくデフォルトで定義されているシステムの$/ レコード区切り記号を使用するか、自分で設定してください。次に、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.
     $/ = "\r\n"
    
     your_pseudo_json.chomp!(",#{$/}")
    
  2. 固定された正規表現を使用して、最後の項目のみを削除します。これは、プラットフォームの行末に関係なく機能します。例えば:

     your_pseudo_json.sub! /,(?:\r?\n)\z/, ""
    
  3. String#delete_suffixをサポートする新しい Ruby を実行している場合! 次に、これを #chomp のように行うことができますが、補間なしの単純な文字列を使用します。例えば:

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

注意事項

Irb または Pry でのテストに非 Bang メソッドを使用する

テストのメモとして、テスト用に REPL で #chomp、#sub、および #delete_suffix の非 bang メソッドを使用して、実験中に文字列を再作成し続ける必要がないようにしてください。bang メソッドは、デフォルトで凍結文字列を有効にして実行していない限り、文字列をその場で変更します。

凍った弦

また、プログラムで凍結された文字列プラグマを使用している場合は、次のように注意してください。

  • # frozen_string_literal: true.rb ファイルの先頭に
  • RUBYOPT="--enable-frozen-string-literal"REPLを呼び出すときの環境で

次に、bang 以外のメソッドを使用して、結果を別の (または同じ) 変数に割り当てます。凍結された文字列の凍結されていないコピーを複製することは、現在の質問の範囲外であるため、この件に関する他の読者による一般的な自転車脱落を防ぐことを除いて、まったく言及しません。:)

于 2021-10-09T17:44:26.397 に答える