Patikrinkite, ar nustatomas kintamasis?

Kaip patikrinti, ar kintamasis yra apibrėžtas Ruby? Ar yra būdas įvesti isset ?

512
14 нояб. „ Readonly“ lapkričio 14 d 2008-11-14 02:14 '08, 14:14 val. 2008-11-14 02:14
@ 14 atsakymų

Naudokite defined? raktinį žodį defined? ( dokumentacija ). Jis grąžins eilutę su elemento tipu arba nil jei jo nėra.

 >> a = 1 => 1 >> defined? a => "local-variable" >> defined? b => nil >> defined? nil => "nil" >> defined? String => "constant" >> defined? 1 => "expression" 

Kaip komentavo Scaly: „Verta pažymėti, kad nulinis kintamasis inicijuojamas.“

 >> n = nil >> defined? n => "local-variable" 
705
14 нояб. Atsakymą pateikė Ricardo Acras lapkričio 14 d 2008-11-14 02:22 '08 at 2:22 am 2008-11-14 02:22

Tai naudinga, jei nenorite nieko daryti, jei ji egzistuoja, bet ją sukurti, jei ji neegzistuoja.

 def get_var @var ||= SomeClass.new() end 
border=0

Tai sukuria tik vieną pavyzdį. Po to jis tiesiog grąžina var.

86
14 нояб. atsakymas yra danmayer 14 lapkričio. 2008-11-14 02:23 '08 at 2:23 am 2008-11-14 02:23

Teisinga aukščiau pateikto pareiškimo sintaksė yra:

 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 

pakeisti ( var ) savo kintamąjį. Ši sintaksė bus teisinga / klaidinga vertinimui, jei išraiška.

66
27 мая '11 в 15:54 2011-05-27 15:54 atsakymas pateikiamas foomip gegužės 27 d., 11 val. 15:54 2011-05-27 15:54

defined?(your_var) veiks. Priklausomai nuo to, ką darote, taip pat galite padaryti kažką panašaus į your_var.nil?

18
14 нояб. atsakymas pateikiamas skaitmeniniu numeriu . 2008-11-14 02:18 '08 at 2:18 2008-11-14 02:18

Pabandykite „jei“ vietoj „jei“

 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 
13
06 апр. vartotojo761856 atsakymas, pateiktas 06 Bal 2012-04-06 23:42 '12, 23:42, 2012-04-06 23:42

Naudojama defined? YourVariable defined? YourVariable
Laikykite jį tik kvailai .;)

7
26 апр. Atsakymą pateikė Saqib R. Balandžio 26 2013-04-26 17:30 „13“ 17:30 val. 2013-04-26 17:30

Štai keletas kodų, o ne vienas raketų mokslas, bet jis veikia gana gerai.

 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 

Akivaizdu, kad spalvos kodas nereikalingas, tik geras vizualizavimas šiame žaislų pavyzdyje.

5
16 сент. atsakymą Sardathrionas pateikia 16 sep . 2010-09-16 10:52 '10, 10:52, 2010-09-16 10:52

Galite pabandyti:

 unless defined?(var) #ruby code goes here end => true 

Kadangi ji grąžina loginę vertę.

4
16 марта '12 в 1:00 2012-03-16 01:00 atsakymą Bruno Barrosas pateikė kovo 16 d. 12 val. 2012-03-16 01:00

Tai yra pagrindinis atsakymas: konkretus? metodas Aukščiau pateiktas priimtas atsakymas tai puikiai iliustruoja.

Tačiau po bangomis yra ryklys.

Apsvarstykite šį tipišką rubino modelį:

  def method1 @x ||= method2 end def method2 nil end 

Sustabdyti ir galvoti apie tai antrą kartą. 2 metodas visada grąžina nulį. Kai pirmą kartą skambinate 1 metodu, @x kintamasis nenustatytas, todėl 2 metodas bus paleistas. ir 2 metodas nustatys @ x iki nulio. Tai gražus, ir visi gerai ir gerai. Bet kas vyksta antrą kartą, kai skambinate metodu1?

Atminkite, kad @x jau yra nulis. Bet ar 2 metodas dar bus paleistas? Jei metodas2 yra brangi įmonė, tai gali būti ne tai, ko jums reikia.

Leiskite duoti? metodas ateina į gelbėjimą

  def method1 return @x if defined? @x @x = method2 end 

Jei nežinojote apie šį triuką, tada „jums reikės didelio valties“.

2
08 июля '17 в 6:31 2017-07-08 06:31 Atsakymą pateikė BKSpurgeon liepos 17 d. 17:31 val. 2017-07-08 06:31

Atkreipkite dėmesį į „apibrėžtą“ ir „priskirtą“ skirtumą.

 $ ruby -e 'def f; if 1>2; x=99; end;px, defined? x; end;f' nil "local-variable" 

x nustatomas, net jei jis niekada nėra paskirtas!

2
12 дек. Robert Klemme atsakymas, pateiktas gruodžio 12 d. 2014-12-12 17:30 '14, 5:30 val. 2014-12-12 17:30

Kaip ir daugelis kitų pavyzdžių, jums nereikia loginio metodo, kad būtų galima logiškai pasirinkti logotipą. Būtų bloga forma priversti viską į logišką, jei tikrai nereikia loginės vertės.

Bet jei jums tikrai reikia loginio. Naudokite! („hit“) arba „melaginga melaginga atskleidžia tiesą“.

 › irb >> a = nil => nil >> defined?(a) => "local-variable" >> defined?(b) => nil >> !!defined?(a) => true >> !!defined?(b) => false 

Kodėl jis paprastai nemoka už prievartą:

 >> (!!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 

Čia yra pavyzdys, kai tai yra svarbu, nes ji remiasi netiesiogine Būlio vertės prievarta jos eilutės atvaizdavimui.

 >> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}" var is defined? true vs local-variable => nil 
2
08 янв. atsakymas, kurį pateikė user325634 Jan 08 2017-01-08 15:07 '17 at 15:07 2017-01-08 15:07

Pažymėtina, kad naudojant defined norint patikrinti, ar tam tikras laukas yra nustatytas maišos režime, gali pasirodyti netikėtas:

 var = {} if defined? var['unknown'] puts 'this is unexpected' end # will output "this is unexpected" 

Čia sintaksė yra teisinga, bet defined? var['unknown'] defined? var['unknown'] bus vertinamas eilutės "method" , todėl if blokas bus įvykdytas

1
15 авг. atsakymas pateikiamas delf 15 rug. 2017-08-15 13:28 '17, 13:28 PM 2017-08-15 13:28

Be to, galite patikrinti, ar jis apibrėžtas eilutėje, naudodami interpoliavimą, jei koduojate:

 puts "Is array1 defined and what type is it? #{defined?(@array1)}" 

Sistema jums pasakys tipą, jei jis nustatytas. Jei jis nėra apibrėžtas, jis paprasčiausiai grąžins įspėjimą, kad kintamasis nėra inicijuotas.

Tikiuosi, kad tai padės :)

0
23 окт. Elliott atsakė spalio 23 d 2015-10-23 19:45 '15, 7:45 pm 2015-10-23 19:45

Norėjau patikrinti, ar kintamieji buvo nustatyti „Mano bėgių“ modelyje, tačiau kai kurie kintamieji buvo apibrėžti kaip trivialūs tuščios eilutės.

Paprasčiausias sprendimas buvo patikrinti, ar kintamojo ilgis buvo> = 1:

 if variable.length >= 1 doSomething 

Atkreipkite dėmesį, kad šis metodas tinka tik tuomet, jei žinote, kad jūsų kintamasis egzistuoja, bet norite patikrinti, ar kintamasis tikrai turi bet kokią vertę.

0
05 дек. atsakymas duotas duhaime 05 dec. 2017-12-05 16:37 '17, 16:37 pm 2017-12-05 16:37

Kiti klausimai apie žymes arba Užduoti klausimą