以下是一項挑戰任務,因此可能無法反映“真實世界”的代碼。我正在嘗試以一種使用一個哈希的屬性回傳一個新哈希的方式設定我的方法。在這種情況下,我的方法是將電子郵件作為字串,使用正則運算式推斷電子郵件的 tld,然后輸出基于 tld 的基于哈希的訊息。在此示例中,它會生成一封使用其注冊的 tld 語言的電子郵件。
該代碼按其應有的方式作業,但未通過一項測驗: “對于任何其他 ccTlD 郵件,應回傳帶有英文訊息資訊的哈希”
當 tld 不在原始翻譯哈希中時,我無法弄清楚如何設定默認值“en”,即 [email protected] 應該只回傳基于英語的翻譯。
獎勵:我還注意到我的 Rubocop 不喜歡我的樣式,因為我的 compose_translated_email 方法有太多行。我無法弄清楚如何將翻譯放在另一種方法中,而不會使該方法太長。
任何幫助將不勝感激 - 而不僅僅是答案,如果您也能解釋代碼在做什么,我會很高興。謝謝你。
LOCALES = {
en: {
subject: "Our website is online",
body: "Come and visit us!",
closing: "See you soon",
signature: "The Team"
},
fr: {
subject: "Notre site est en ligne",
body: "Venez nous rendre visite !",
closing: "A bientot",
signature: "L'équipe"
},
de: {
subject: "Unsere Website ist jetzt online",
body: "Komm und besuche uns!",
closing: "Bis bald",
signature: "Das Team"
}
}
def compose_translated_email(email)
username = email.match(/^(\w*)/)[1]
domain = email.match(/[^@] (?=\.)/)[0]
tld = email.match(/.*\.(\w )$/)[1]
tldsym = tld.to_sym
new_hash = {
username: username,
domain: domain,
tld: tld,
subject: LOCALES[tldsym][:subject],
body: LOCALES[tldsym][:body],
closing: LOCALES[tldsym][:closing],
signature: LOCALES[tldsym][:signature]
}
return new_hash
end
uj5u.com熱心網友回復:
在創建哈希之前默認tldto的值還不夠嗎?en如:
(...)
# default to english language
tldsym = tld.to_sym
# i.e. if the key does not exist in LOCALES, use "en" as key
tldsym = LOCALES.key?(tldsym) ? tldsym : "en".to_sym
(...)
考慮到您的額外問題,您可以通過回圈填充翻譯后的值以節省幾行:
(...)
new_hash = {
username: username,
domain: domain,
tld: tld,
}
%i(subject body closing signature).each { |k| new_hash[k] = LOCALES[tldsym][k] }
(...)
說明:我們正在遍歷將從LOCALES散列中填充的鍵名陣列(主題、正文、結束、簽名)。該%i符號(需要 Ruby 2.0.0 或更高版本)立即為我們提供了一個陣列,其中包含這些鍵的符號,因此塊to_sym內不需要each- 我們可以k在源代碼和目標哈希。
通過迭代填充其他哈希槽來節省額外的行:
(...)
new_hash = {}
%W(username domain tld).each { |k| new_hash[k.to_sym] = eval(k) }
%i(subject body closing signature).each { |k| new_hash[k] = LOCALES[tldsym][k] }
(...)
說明:這里我們%W用來獲取一個字串陣列,所以我們需要to_sym目標中的鍵。然后使用 uation 決議目標值eval,我猜這可能不是最干凈的樣式。
請原諒任何愚蠢的錯誤,我自己是 Ruby 初學者:)
uj5u.com熱心網友回復:
我會做這樣的事情:
LOCALES = Hash.new({
subject: "Our website is online",
body: "Come and visit us!",
closing: "See you soon",
signature: "The Team"
}).merge({
'fr' => {
subject: "Notre site est en ligne",
body: "Venez nous rendre visite !",
closing: "A bientot",
signature: "L'équipe"
},
'de' => {
subject: "Unsere Website ist jetzt online",
body: "Komm und besuche uns!",
closing: "Bis bald",
signature: "Das Team"
}
}).freeze
def compose_translated_email(email)
email.scan(/([^@] )@(.*\.([^.] ))/) => [[username, domain, tld]]
{
username:,
domain:,
tld:,
**LOCALES[tld]
}
end
它不是世界上最漂亮的代碼,但它會做到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436764.html
