2010-11-26 1 views
2

Я googled, что есть функция is_a?, чтобы проверить, является ли объект целым или нет.Имеет ли ruby ​​1.9.2 значение is_a? функционировать?

Но я пробовал в консоли рельсов, и он не работает.

Я побежал код вроде следующего:

"1".is_a? 
1.is_a? 

ли я что-то пропустил?

+1

Google хорош, но не на первое место искать то, что находится в стандартных и основных библиотеках Ruby. Я бы рекомендовал перейти к первоисточнику: `ri` вашей собственной машины или [сайт rubydoc] (http://www.ruby-doc.org/).Ввод `ri is_a?` В вашей командной строке может вернуть пару хитов, причем важный из них - `Object.is_a?` – 2010-11-26 03:31:51

+0

Связанный с вами вопрос: что вы пытаетесь сделать: [Извлечь число из шаблона строки с использованием регулярного выражения ] (http://stackoverflow.com/questions/694176/retrieve-number-from-the-string-pattern-using-regular-expression) – 2010-11-26 07:53:53

ответ

3

Там не встроенная функция, чтобы сказать, если строка фактически целое , но вы можете легко сделать свой собственный:

class String 
    def int 
    Integer(self) rescue nil 
    end 
end 

Это работает, потому что метод Kernel Integer() выдает ошибку, если строка не может быть преобразована в целое число, а строка inline rescue nil превращает эту ошибку в нуль.

Integer("1") -> 1 
Integer("1x") -> nil 
Integer("x") -> nil 

и, таким образом:

"1".int -> 1 (which in boolean terms is `true`) 
"1x".int -> nil 
"x".int -> nil 

Вы можете изменить функцию, чтобы вернуть true в истинных случаях, вместо самого целого, но если вы проверяете строку, чтобы увидеть, если это целое число , скорее всего, вы хотите использовать это целое для чего-то! Я очень часто делать такие вещи, как это:

if i = str.int 
    # do stuff with the integer i 
else 
    # error handling for non-integer strings 
end 

Хотя если задание в тестовой позиции оскорбляет вас, вы всегда можете сделать это следующим образом:

i = str.int 
if i 
    # do stuff with the integer i 
else 
    # error handling for non-integer strings 
end 

Так или иначе, этот метод не только преобразование один раз, который, если вам нужно сделать много из них, может быть значительным преимуществом в скорости.

[Измененное имя функции от int? к int, чтобы избежать подразумевая, что должен возвращать только истина/ложь.]

0

Ruby имеет функцию response_to? который может использоваться для просмотра, если у определенного класса или объекта есть метод с определенным именем. Синтаксис нечто вроде

User.respond_to?('name') # returns true is method name exists 
otherwise false 

http://www.prateekdayal.net/2007/10/16/rubys-responds_to-for-checking-if-a-method-exists/

+0

`response_to?` сильно отличается от `is_a?`. – 2010-11-26 03:25:39

+0

@Greg: `is_a?` Смотрит на класс, тогда как `response_to?` Был бы полезен для утиной печати. – 2010-11-26 07:31:50

+0

+1: В Ruby предпочтительнее проверить, что объект делает то, что вы хотите, а не экземпляр какого-либо класса. Ruby больше полагается на «утиную печать», чем на строгое наследование. – 2010-11-26 17:11:06

19

Вы забыли включить класс вы сравниваете:

"1".is_a?(Integer) # false 
1.is_a?(Integer) # true 
+0

спасибо, на самом деле моя ситуация в том, что я хочу проверить строку - это число, если «1» .is_a? (Ingeger) возвращает false, кажется, что это не полезно для этой ситуации – mlzboy 2010-11-26 03:33:09

1

я использовал регулярное выражение

if a =~ /\d+/ 
    puts "y" 
else 
    p 'w' 
end 
0

Может быть, это поможет вам

str = "1" 
=> "1" 
num = str.to_i 
=> 1 
num.is_a?(Integer) 
=> true 

str1 = 'Hello' 
=> "Hello" 
num1 = str1.to_i 
=> 0 
num1.is_a?(Integer) 
=> true 
0

Мне хотелось чего-то подобного, но ни один из них не сделал это для меня, но это делает - используйте «класс»:

a = 11 
a.class 
=> Fixnum