簡體   English   中英

使用 Ruby 對方法挑戰進行故障排除

[英]Troubleshooting a method challenge with Ruby

這里簡單的問題。 我從未在 ruby 中編程......所以我想我在這里問過我是否接近解決方案。

挑戰:

問題定義:這個Ruby方法應該保證“Twitter”這個詞拼寫正確。

def fix_spelling(name)
  if name = "twittr"
    name = "twitter"
  else
    fix_spelling(name)
  end
  return "name"
end

我檢查了如何在 ruby 中構建方法,並得出以下解決方案:

我發現的問題:

  1. 該方法在 function 內部被調用,因此它永遠不會打印任何內容。
  2. 返回實際上是返回一個字符串“名稱”而不是變量。
def fix_spelling(name)
  if name = "twittr"
    name = "twitter"
  end
  return name
end

puts fix_spelling("twittr")

這是正確的嗎?

打印:

def fix_spelling(name)
  if name == "twittr"
    name  = "twitter"
  end
  return name
end


puts fix_spelling(name = "twittr");

修復和縮短原始代碼

當前解決方案的一個更短、更慣用的版本如下所示:

def fix_spelling name
  name == 'twittr' ? 'twitter' : name
end
# validate inputs
p %w[twitter twittr twit].map { |word| fix_spelling word }
#=> ["twitter", "twitter", "twit"]

但是,這實際上只是返回nametwittr以外的任何其他值,無論拼寫是否正確。 如果這是你所期望的,那很好。 否則,您將需要開發一組可以“糾正”各種其他拼寫錯誤的 case 語句或返回值。 您也可以考慮使用Levenshtein 距離或其他啟發式進行模糊匹配,而不是使用固定字符串或正則表達式來 map 您的輸入到輸出。

模糊匹配

考慮這種替代方法,它使用 gem 來確定Damerau-Levenshtein編輯距離是否為正確拼寫單詞長度的約 50%,允許添加其他單詞,並在可以時返回用問號括起來的原始單詞'更正:

require 'damerau-levenshtein'

WORD_LIST = %w[Facebook Twitter]

def autocorrect word
  WORD_LIST.map do |w| 
    max_dist = (w.length / 2).round
    return w if DamerauLevenshtein.distance(w, word) <= max_dist 
  end 
  '?%s?' % word
end

# validate inputs
p %w[twitter twittr twit facebk].map { |word| autocorrect word }
#=> ["Twitter", "Twitter", "?twit?", "Facebook"]

這並不是真正的“盒子中的拼寫檢查器”,而是為更靈活的框架提供了基礎,如果您打算這樣做的話。 我從這個答案的 scope 中排除了很多邊緣情況,例如正確的單詞映射、大寫、詞干和縮寫(想想 Facebook 的“fb”),但編輯距離肯定會讓你走得更遠比原始示例更全面的自動更正解決方案。 您的里程肯定會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM