首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Ruby解决一个方法问题

用Ruby解决一个方法问题
EN

Stack Overflow用户
提问于 2021-01-05 19:37:23
回答 1查看 212关注 0票数 0

这里的问题很简单。我从来没有用红宝石编程..。所以我想我要在这里确认我是否已经接近解决方案了。

挑战:

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

代码语言:javascript
复制
def fix_spelling(name)
  if name = "twittr"
    name = "twitter"
  else
    fix_spelling(name)
  end
  return "name"
end

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

我发现的问题是:

  1. 该方法在函数中被调用,因此它将永远不会打印任何内容。
  2. 返回实际上是返回一个字符串"name“,而不是变量。
代码语言:javascript
复制
def fix_spelling(name)
  if name = "twittr"
    name = "twitter"
  end
  return name
end

puts fix_spelling("twittr")

这是对的吗?

恶作剧:

代码语言:javascript
复制
def fix_spelling(name)
  if name == "twittr"
    name  = "twitter"
  end
  return name
end


puts fix_spelling(name = "twittr");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-06 01:40:06

修改和缩短原代码

当前解决方案的一个更短、更实用的版本如下所示:

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

但是,这实际上只是返回twittr以外的任何其他值的名称,不管拼写是否正确。如果这是你想要的,好吧。否则,您将需要开发一组case语句或返回值,以“纠正”其他类型的拼写错误。您还可以考虑使用Levenshtein距离或其他启发式方法进行模糊匹配,而不是使用固定字符串或正则表达式将输入映射到输出。

模糊匹配

考虑一下这种替代方法,它使用gem来确定达梅罗-莱文编辑距离是否是拼写正确的单词长度的50%左右,允许额外的单词,并在无法更正时返回以问号括起来的原始单词:

代码语言:javascript
复制
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"]

这并不是真正的“方框中的拼写检查器”,但它为更灵活的框架提供了基础,如果这就是您要做的事情的话。有许多边缘情况,如正确的单词映射,大写,单词词干,和缩写(考虑"fb“的脸书),我排除在这个答案的范围之外,但编辑距离肯定会使你进一步走向一个全面的自动校正的解决方案比最初的例子。你的里程肯定会有变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65585461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档