我試圖在 Ruby 2.4 中修改一個包含數字和度量單位的變數字串。我的目標是采用以下字串,舍入數字部分,并將單位部分大寫:
my_string = "123.456789 dollars"
我知道有各種各樣的方法可以用多行代碼完成這個操作,但我正在使用一個獨特的界面和一個獨特的環境,目標是使用一行代碼來撰寫它盡可能短。我知道我可以做這樣的事情:
my_array =my_string.split; my_array[0].to_f.round(2).to_s " " my_array[1].capitalize
...但我的目標是取消分號,使用更少的字符,并避免兩次呼叫陣列。
我的想法是按照以下方式做一些事情:
my_string.split.*do_this*(self.to_f.round(2), self.capitalize).join(" ")
有沒有辦法在 2.5 版之前做這樣的事情?
我也對其他想法持開放態度,但同樣,目標是盡可能短的單行代碼,以及使用不同引數修改 2 個元素的能力。
請注意:升級到較新版本的 Ruby 不是一種選擇。2.4 是當前硬編碼到我們正在使用的軟體包中的版本。
uj5u.com熱心網友回復:
如果只有兩個元素,則可以使用then和字串插值:
my_string.split.then { |f, s| "#{f.to_f.round(2)} #{s.capitalize}" }
或者也許是以下之一:
my_string.split.then { |f, s| sprintf("%.2f #{s.capitalize}", f) }
my_string.split.then { |f, s| sprintf('%.2f %s', f, s.capitalize) }
my_string.split.then { |f, s| "%.2f #{s.capitalize}" % f }
或者,如果可能有兩個以上的元素,您可以組合map和with_index:
my_string.split.map.with_index { |e, i| i == 0 ? e.to_f.round(2) : e.capitalize }.join(' ')
uj5u.com熱心網友回復:
我發現在 Ruby 2.4 中,我們instance_eval至少可以通過幾種不同的方式使用該方法,例如:
my_string.split.instance_eval { |f, s| "#{f.to_f.round(2)} #{s.capitalize}" }
或者
my_string.split.instance_eval { |a| "#{a[0].to_f.round(2)} #{a[1].capitalize}" }
或者
my_string.split.instance_eval { |f, s| [f.to_f.round(2), s.capitalize]}.join(" ")
我們也可以使用tap只需要幾個字符的方法:
my_string.split.tap { |a| a[0..-1] = [a[0].to_f.round(2), a[1].capitalize]}.join(" ")
或者我們甚至可以map通過創建一個嵌套陣列來使用該方法,如以下兩個示例中所示:
[my_string.split].map{|a| "#{a[0].to_f.round(2)} #{a[1].capitalize}"}.join
和
[my_string.split].map{|a| [a[0].to_f.round(2)," ",a[1].capitalize]}.join
作為額外的獎勵,我們甚至可以執行以下不需要使用塊的操作:
(a, b = my_string.split).replace([a.to_f.round(2)," ",b.capitalize ]).join
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389769.html
