/ / Setter nepracuje s - =, + =, atď.? [duplikát] - rubín

Setter nefunguje s - =, + =, atď? [duplikát] - rubín

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ď č. 1

Napíš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 = 1Ruby 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