Undefined instance variable
значение всегда будет nil
. Если вы получите к нему доступ, оно не сгенерирует никакого исключения, тогда как локальная переменная сгенерирует исключение, если оно не было определено, если вы хотите проверить, назначена ли переменная экземпляра или нет Вы можете использовать .present?
метод.
Вот простой пример этого
Instance variable
2.5.1 :009 > @undefined
=> nil
2.5.1 :010 > @undefined.present?
=> false
2.5.1 :011 > defined? @undefined
=> nil
2.5.1 :014 > @defined = "test"
=> "test"
2.5.1 :015 > @defined.present?
=> true
2.5.1 :016 > defined? @defined
=> "instance-variable"
Local variable
2.5.1 :017 > undefined_local
Traceback (most recent call last):
1: from (irb):17
NameError (undefined local variable or method `undefined_local' for main:Object)
2.5.1 :018 > undefined_local.present?
Traceback (most recent call last):
1: from (irb):18
NameError (undefined local variable or method `undefined_local' for main:Object)
2.5.1 :019 > defined? undefined_local
=> nil
2.5.1 :020 > defined_local = "test"
=> "test"
2.5.1 :021 > defined? defined_local
=> "local-variable"
Надеюсь, этого достаточно, чтобы понять концепцию