18

快速提问。

如何测试一个单词以查看它是单数还是复数?

我真的很想:

test_singularity('word') # => true
test_singularity('words') # => false

我敢打赌rails是有能力的!

谢谢。

4

3 回答 3

21

在 Rails 中,您可以进行string#singularize|#pluralize比较以返回 true 或 false 值。

但我认为由于语言本身的性质,这可能需要一些备份才能完全准确。

你可以做这样的事情

def test_singularity(str)
  str.pluralize != str && str.singularize == str
end

但是为了看看有多准确,我跑了一组快速的单词。

%w(word words rail rails dress dresses).each do |v|
  puts "#{v} : #{test_singularity(v)}"
end

word : true
words : false
rail : true
rails : false
dress : false
dresses : false

实际上我有点惊讶,因为“dress”确实可以正确地复数,但是当它通过#singularize 时会遇到一些障碍。

'dress'.pluralize # => dresses
'dress'.singularize # => dres
于 2009-11-26T05:45:49.253 回答
9

大多数时候我从不测试单数或复数,我只是将其转换为我需要的单数或复数形式。

Rails 2.3.x中这是可能的,写这样的东西

plural_form = org_word.singularize.pluralize
singular_form = org_word.pluralize.singularize

进一步研究这个,一个工作函数很容易提供:

require 'active_support'

def is_singular?(str)
  str.pluralize.singularize == str
end


%w(word words rail rails dress dresses).each do |v|
  puts "#{v} : #{is_singular?(v)}"
end

给出以下输出:

word : true
words : false
rail : true
rails : false
dress : true
dresses : false

Rails 4中,使用给定的单词,现在要容易得多。你可以做

plural_form = org_word.pluralize
singular_form = org_word.singularize

因此该功能也变得更加容易:

require 'active_support'

def is_singular?(str)
  str.singularize == str
end
于 2009-11-26T10:20:33.840 回答
1

ruby 和 rails 都没有提供用于测试单词“复数”的特定方法。

正如 nowk 所说,您最多可以自己实现它们,与word.pluralize和进行比较word.singularize。这将为您提供一种快速、廉价且普遍良好的测试方式。不过,它有时会失败。

如果您需要更高的精度,您将需要使用Ruby Linguistics gem,它可以正确处理dress 和dresses(但它更重)。

于 2009-11-26T11:46:30.280 回答