Ruby'de bir değişkenin tanımlanıp tanımlanmadığını nasıl kontrol edebilirim? isset
Mevcut bir -tip yöntemi var mı?
Ruby'de bir değişkenin tanımlanıp tanımlanmadığını nasıl kontrol edebilirim? isset
Mevcut bir -tip yöntemi var mı?
Yanıtlar:
defined?
Anahtar kelimeyi kullanın ( belgeler ). Öğenin türünü içeren bir Dize döndürür ( nil
yoksa).
>> a = 1
=> 1
>> defined? a
=> "local-variable"
>> defined? b
=> nil
>> defined? nil
=> "nil"
>> defined? String
=> "constant"
>> defined? 1
=> "expression"
Skalee'nin yorumladığı gibi: "Nil olarak ayarlanan değişkenin başlatıldığını belirtmek gerekir."
>> n = nil
>> defined? n
=> "local-variable"
||=
operatörün dahil olduğu) bakınız.
defined?
bir değişken tanımlarsanız, o blok içinde tanımlanan bir değişken için hala true değerini döndürür!
defined?
Boole döndüren böyle bir yöntem var mı ?
!!defined?(object_name)
Eğer varsa hiçbir şey yapmak istemiyorsanız, eğer yoksa yaratın.
def get_var
@var ||= SomeClass.new()
end
Bu, yeni örneği yalnızca bir kez oluşturur. Bundan sonra sadece var döndürmeye devam ediyor.
||=
boolean değerlerle kullanmayın , karışıklığın acısını hissetmeyin.
nil
yanı sen sürece gerçekten buna dönüşünü yaptığında deniyor ifadeyi her zaman değerlendirmek istediğiniznil
var = (var or var.nil?)
Yukarıdaki ifade için doğru sözdizimi:
if (defined?(var)).nil? # will now return true or false
print "var is not defined\n".color(:red)
else
print "var is defined\n".color(:green)
end
( var
) değişkeninizle değiştirilir. Bu sözdizimi, if ifadesinde değerlendirme için doğru / yanlış değeri döndürür.
defined?(var) == nil
?
.nil?
Dedikleri gibi çağrıyı kullanmak daha deyimseldir. Bir nesneye nil
karşılaştırma operatörü kullanmaktan ziyade sormak daha "nesne yönelimlidir" . İkisini de okumak zor, bu yüzden hangisini daha fazla ürün göndermenize yardımcı olursa kullanın.
defined?(your_var)
çalışacak. Ne yaptığınıza bağlı olarak şöyle bir şey de yapabilirsinizyour_var.nil?
your_var.nil?
false değerini döndürdüğü ve okumak ve yazmaktan çok daha hoş olduğu için defined? var
. Bunun için teşekkürler.
your_var.nil?
hataya neden olur: daha undefined local variable or method your_var
önce tanımlanmadığında ...
"İf" yerine "unless" komutunu deneyin
a = "apple"
# Note that b is not declared
c = nil
unless defined? a
puts "a is not defined"
end
unless defined? b
puts "b is not defined"
end
unless defined? c
puts "c is not defined"
end
İşte bazı kod, roket bilimi yok ama yeterince iyi çalışıyor
require 'rubygems'
require 'rainbow'
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined\n".color(:red)
else
print "car is defined\n".color(:green)
end
Açıkça, renklendirme kodu gerekli değildir, bu oyuncak örneğinde sadece güzel bir görselleştirme.
nil?
isteğe bağlıdır.
Bu anahtar cevap: defined?
yöntem. Yukarıdaki kabul edilen cevap bunu mükemmel bir şekilde göstermektedir.
Ama dalgaların altında gizlenen bir köpekbalığı var ...
Bu tür ortak yakut desenini düşünün:
def method1
@x ||= method2
end
def method2
nil
end
method2
her zaman geri döner nil
. Aradığınızda İlk kez method1
, @x
değişken ayarlı değil - bu nedenle method2
işletilecek. ve method2
ayarlayacaktır @x
için nil
. Bu iyi ve her şey yolunda ve güzel. Fakat ikinci aradığınızda ne olur method1
?
@X'in zaten sıfır olarak ayarlandığını unutmayın. But method2
yine tekrar çalıştırılacak !! Method2 maliyetli bir girişim ise, bu istediğiniz bir şey olmayabilir.
defined?
Yöntemin kurtarmaya gelmesine izin verin - bu çözümle, bu özel durum ele alınır - aşağıdakileri kullanın:
def method1
return @x if defined? @x
@x = method2
end
Şeytan ayrıntılarda gizlidir: ancak defined?
yöntemle gizlenen köpekbalığından kaçabilirsiniz .
Deneyebilirsin:
unless defined?(var)
#ruby code goes here
end
=> true
Çünkü bir boole döndürür.
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
ifade kullanmak aşırı karmaşık görünüyor
Diğer birçok örnekte gösterildiği gibi, yakutta mantıksal seçimler yapmak için bir yöntemden bir boole gerek yoktur. Aslında bir boole ihtiyacınız olmadığı sürece her şeyi bir boole zorlamak kötü bir form olacaktır.
Ama kesinlikle bir boole ihtiyacınız varsa. Kullanın !! (bang bang) veya "falsy falsy gerçeği ortaya çıkarır".
› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false
Neden genellikle baskı için ödeme yapmıyor:
>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true
Burada önemli olan bir örnek var, çünkü boole değerinin dize temsiline örtülü zorlamasına dayanıyor.
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
defined
Bir hash içinde belirli bir alanın ayarlanıp ayarlanmadığını kontrol etmek için kullanmanın beklenmedik davranabileceğini belirtmek gerekir :
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
Sözdizimi burada doğrudur, ancak defined? var['unknown']
dizeye göre değerlendirilir "method"
, böylece if
blok yürütülür
edit: Bir anahtar bir karma içinde olup olmadığını kontrol etmek için doğru gösterim olurdu:
if var.key?('unknown')
Lütfen "tanımlı" ve "atanmış" arasındaki farkı not edin.
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
x asla atanmamış olmasına rağmen tanımlanır!
NameError Exception: undefined local variable or method
ve değişkenin tek ataması / sözü, isabet alamayan bir if bloğunda olduğunda kafası karışmıştı.
Ayrıca, kod yazarsanız, bir dizede iken enterpolasyon yoluyla tanımlanıp tanımlanmadığını kontrol edebilirsiniz:
puts "Is array1 defined and what type is it? #{defined?(@array1)}"
Sistem tanımlanmışsa size türü söyleyecektir. Tanımlanmamışsa, değişkenin başlatılmadığını belirten bir uyarı döndürür.
Bu yardımcı olur umarım! :)
defined?
harika, ancak bir Rails ortamındaysanız try
, özellikle dinamik bir değişken adını kontrol etmek istediğiniz durumlarda da kullanabilirsiniz :
foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo) # => 1
try(:bar) # => nil
try(my_foo) # => 1
try(my_bar) # => nil
nil
edilir başlatıldı.