В ruby ​​1.9.2 есть is_a?функционировать? - PullRequest
2 голосов
/ 26 ноября 2010

Я гуглил, что есть функция is_a? для проверки, является ли объект целым числом или нет.

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

Я запустил код следующим образом:

 "1".is_a?
 1.is_a?

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

Ответы [ 6 ]

19 голосов
/ 26 ноября 2010

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

"1".is_a?(Integer) # false
1.is_a?(Integer) # true
3 голосов
/ 26 ноября 2010

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

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

Это работает, потому что метод Kernel Integer() выдает ошибку, еслиСтрока не может быть преобразована в целое число, а встроенный 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, чтобы не указывать, что оно должно возвращать только значение true/false.]

1 голос
/ 26 ноября 2010

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

if a =~ /\d+/
   puts "y"
else
   p 'w'
end
0 голосов
/ 31 мая 2011

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

a = 11
a.class
=> Fixnum
0 голосов
/ 26 ноября 2010

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

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

В 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/

...