【问题标题】:Troubleshooting a method challenge with Ruby使用 Ruby 解决方法挑战
【发布时间】:2021-01-05 19:37:23
【问题描述】:

这里是一个简单的问题。我从来没有用 ruby​​ 编程过......所以我想我在这里问过我是否接近解决方案。

挑战:

问题定义:这个 Ruby 方法应该确保单词“Twitter”的拼写正确。

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

我检查了如何在 ruby​​ 中构建方法并得出以下解决方案:

我发现的问题:

  1. 该方法在函数内部被调用,因此它永远不会打印任何内容。
  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");

【问题讨论】:

  • 对我来说看起来是正确的。在您的第一个代码中,如果字符串不是“twittr”,您实际上有无限递归,因为fix_spelling 将调用fix_spelling,这将无限继续,永远不会结束
  • 我是这么认为的...我确实认为这将与递归有关。但是,我在 Repl.it 中对其进行了测试,当我调用该方法时,它会产生 twittr。有任何想法吗?我刚刚编辑了主要问题并添加了我必须如何调用它并且它起作用了!你还能怎么称呼它?出于好奇!加油!
  • 你的问题我不清楚。您问题中的最后一个版本可以正常工作,您可以通过将代码复制'n'粘贴到 IRB 控制台来轻松证明它。正如您已经注意到的那样,其他两个版本不起作用。你的问题究竟是什么?
  • 您的代码包含 115 个字符,远低于 280,所以我看不出有问题。

标签: ruby


【解决方案1】:

修复和缩短原始代码

您当前解决方案的一个更短且更惯用的版本如下所示:

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

然而,这实际上只是为twittr 以外的任何其他值返回name,无论拼写是否正确。如果这是你所期望的,那很好。否则,您将需要开发一组可以“纠正”各种其他拼写错误的 case 语句或返回值。您也可以考虑使用Levenshtein distance 或其他启发式进行模糊匹配,而不是使用固定字符串或正则表达式将输入映射到输出。

模糊匹配

考虑这种替代方法,它使用 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"]

这并不是真正的“盒子里的拼写检查器”,而是为更灵活的框架提供了基础,如果这就是您要使用的地方。有很多边缘情况,例如正确的单词映射、大写、词干和缩写(想想 Facebook 的“fb”),我不包括在这个答案的范围内,但编辑距离肯定会让你走得更远比原始示例更全面的自动更正解决方案。您的里程肯定会有所不同。

【讨论】:

  • 谢谢!现在我知道在 Ruby 中你也有三元表达式 :)