Проверьте, является ли слово единственным или множественным числом в Ruby on Rails - PullRequest
17 голосов
/ 26 ноября 2009

Быстрый вопрос.

Как я могу проверить слово, чтобы увидеть, является ли оно единственным или множественным?

Мне бы очень хотелось:

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

Могу поспорить, рельсы способны!

Спасибо.

Ответы [ 3 ]

20 голосов
/ 26 ноября 2009

Ну, в рельсах, вы можете сделать сравнение string#singularize|#pluralize, чтобы получить истинное или ложное значение.

Но я бы подумал, что из-за природы самого языка, для полной точности может потребоваться некоторое резервное копирование.

Вы могли бы сделать что-то вроде этого

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

На самом деле я был немного удивлен, так как «платье» действительно множественным образом правильно, но когда оно проходит через #singularize, оно наталкивается на некоторую загадку.

'dress'.pluralize # => dresses
'dress'.singularize # => dres
9 голосов
/ 26 ноября 2009

В большинстве случаев я никогда не проверяю единственное или множественное число, я просто конвертирую его в единственное или множественное число, которое мне требуется.

В 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
0 голосов
/ 26 ноября 2009

Ни ruby, ни rails не поставляются с особым методом проверки «множественности» слов.

Как сказал Nowk, самое большее, что вы можете сделать, это реализовать их самостоятельно, сравнивая с word.pluralize и word.singularize. Это даст вам быстрый и дешевый и в целом хороший способ тестирования. Но иногда это не получится.

Если вам нужна большая точность, вам нужно будет использовать Ruby Linguistics gem , который может правильно обращаться с платьем и платьем (но он тяжелее).

...