我正在用 ruby?? 撰寫一個小型包管理器,在處理它的包搜索功能時,我想繼續迭代匹配串列,即使它找到了與輸入字串相同的包或字串。
def makelist(jsn, searchterm)
len = jsn.length
n = 0
while n < len do
pkname = jsn[n]["Name"]
pkdesc = jsn[n]["Description"]
pkver = jsn[n]["Version"]
unless pkname != nil || pkdesc != nil
# skip
else
puts "#{fmt(fmt("aur/", 6),0)}#{fmt(pkname,0)} [#{fmt(pkver,8)}]\n #{pkdesc}"
n = 1
end
end
end
我嘗試使用 if 陳述句,除非陳述句和 case 陳述句,其中我給出了條件,如果它專門找到與searchterm匹配的包,它應該做什么,但是當我使用這個條件時,它總是跳過所有其他條件并結束回圈,僅列印該結果。此代碼塊有效,但我想使用我的fmt函式在串列中以不同方式格式化匹配文本。有人對我如何做到這一點有任何想法嗎?
uj5u.com熱心網友回復:
編輯:基于一些來回所需的行為是列印匹配的結果與不匹配的結果不同。
因此,在 Ruby 中,您可以訪問諸如 select、map、reduce 等“功能性”模式,這些模式對您在此處所做的作業很有用。
將功能分成不同的方法也是有利的(例如,一種用于搜索,一種將它們轉換為字串,一種用于列印輸出)。這只是一個如何分解它的示例,但是通過檢查中間結構,拆分職責可以更容易地測驗和查看哪個函式沒有按照您的意愿執行。
另外,我不確定你想如何“匹配”搜索詞,所以我使用了String#include?但你可以用你喜歡的任何匹配演算法替換它。
但我認為你正在尋找這樣的東西:
def makelist(jsn, searchterm)
jsn.select do |package|
package["Name"] && package["Description"]
end.map do |package|
if matches?(package, searchterm)
matched_package_to_string(package)
else
package_to_string(package)
end
end.join("\n")
end
def matches?(package, searchterm)
package['Name'].include?(searchterm) || package('Description').include?(searchterm)
end
def matched_package_to_string(package)
pkname = package["Name"]
pkdesc = package["Description"]
pkver = package["Version"]
"#{fmt(fmt("aur/", 6),0)}#{fmt(pkname,0)} [#{fmt(pkver,8)}]\n #{pkdesc}"
end
def package_to_string(package)
# Not sure how these should print
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/495309.html
