Nerozumiem, prečo som dostal nulovú chybu. Vytvoril som správne nastavovač. Ale neakceptuje - =, + = alebo sám za operátorom =. Prečo?
class Test
def var; @var || 0; end
def var=(value)
@var = value
end
def initialize
@var = 2.4 # Sample value
end
def test
puts var
var -= 1 # <<< crash: undefined method for nil class
puts var
var = var - 1 # <<< crash: undefined method for nil class
puts var
end
end
a = Test.new
a.test
odpovede:
5 pre odpoveď č. 1Napíšte ako
def test
puts var
self.var -= 1
puts var
self.var = var - 1
puts var
end
Ak nepoužívate self
, potom s nimi Ruby bude zaobchádzať var
ako lokálne premenné setter
volania metód.
Len si pamätajte, v Ruby volanie metódy nemôžu byť nikdy vyrobené bez prijímača (implicitné / explicitné). Teraz, keď píšete var = 1
Ruby sa bude správať ako lokálne priradenie premennej, Ale ak píšete self.var
, Ruby ho bude analyzovať ako volanie metódy a ak je to definované, pokúsi sa zavolať vašu metódu nastavovania. Pamätajte tiež self.var = 1
je a syntaktický cukor z self.var=(1)
.
Existuje zaujímavá diskusia o tom istom, ktorú treba prečítať Súkromné setri môžu volať samostatne, prečo nie getters?
Je tu novinka ploštice bolo zistené, pokiaľ ide o súkromných tvorcov, Tu je ploštice lístok a teraz je tiež opravený.
0 pre odpoveď č. 2
Pretože var nie je nulový. musíte mu najprv priradiť nejakú hodnotu
def test
puts var
var=0
var -= 1 # <<< crash: undefined method for nil class
puts var
var=0
var = var - 1 # <<< crash: undefined method for nil class
puts var
end
-1 pre odpoveď č. 3
UPDATE: Nie je jasné, či chcete premennú inštancie alebo premennú triedy pre premennú „var“. Nižšie uvedený príklad sa týka premennej inštancie.
Použil by som attr_reader alebo attr_accessor, ak to chceš urobiť mimo triedy.
class Test
attr_reader :var
def initialize
@var=2.4
end
def test
puts @var
@var -= 1
puts @var
@var = @var - 1
puts @var
end
end
t=Test.new
t.test
puts t.var
$ /tmp/t.rb
2.4
1.4
0.3999999999999999
0.3999999999999999