ruby class def func es def self.func

Hali,

el tudna nekem valaki magyarazni mi a kulonbseg e ketto kozott:


class Valami
   def func
      nil
   end
   def self.func2
      nil
   end
end

es hogy az alabbi mert nem mukodik, bar feltetelezem a fenti kulonbseg miatt:


class Module
    def define_attribute(*symbols)
        symbols.each do |symbol|
            module_eval( "def self.#{symbol}(val = nil) val ? @#{symbol} = val : @#{symbol}; end" )
            module_eval( "def #{symbol}() @#{symbol}; end" )
        end
    end
end

class Token
    define_attribute :string, :argno, :arg0, :arg1
end

class Mov < Token
    string  'mov'
    argno   2
    arg0    :register
    arg1    :register
end

m = Mov.new
puts " --- #{m.string} ---"

Koszi

Hozzászólások

nem is ertem mit akarsz csinalni
ha csak egy sima attributomot arra ott van az attr_accessor

meg tudod te is irni de akkor
a module_eval ban: def valtozonev=(ertek) es def valtozonev
et kell raknod

a def self.func az osztaly tipushoz tartozik
mig a def func az abbol kepzett instance-hoz

ruby magick :)

jol gondolod a self miatt nem mukodik

nezd, ket objektum van amit te egynek nezel

az egyik az ami leirja a Mov ot, hogy milyen metodusai vannak, ezt ered el a self el, vagy kivulrol a Mov. -al
-ennek az objektumnak a tipusa Class (p Mov.class)
-itt nem szoktak instance variable eket hasznalni, bar lehetseges
-kevesbe dinamikus nyelvekben ilyen objektum nincs csak maximum a fordito belsejeben mikozben fordit

a masik pedig egy Mov tipusu objektum az instance, ezt csak new utan ered el mert akkor jon letre
-ennek tipusa Mov (p m.class)

a @ az az instance variable-t jelenti tehat az adott instance-hoz tartozo adat

a fenti esetben te a self.string ben adtal egy @string = 'mov' ot
ezt a Mov.string-el tudod elerni utana kivulrol

talan meg segit ez is:

p Mov.instance_variables
p m.instance_variables

kicsit keszekusza lett ez a magyarazat de remelem dereng mar valami

lasd kivel van dolgod megirtam ugy hogy mukodjon is


class Module
   def define_attribute(*symbols)
      symbols.each do |symbol|
         module_eval( "def #{symbol}(val = nil) val ? @#{symbol} = val : @#{symbol}; end" )
      end
   end
end

class Token
   define_attribute :string, :argno, :arg0, :arg1
end

class Mov < Token
   def initialize
      string  'mov'
      argno   2
      arg0    :register
      arg1    :register
   end
end

m = Mov.new
puts " --- #{m.string} ---"

a def self.func az osztaly tipushoz tartozik
mig a def func az abbol kepzett instance-hoz

Ezt nagyon-nagyon csunyan ugy szokjak mondani, hogy a self.func az statikus metodust csinal (es igazabol nem is a pont hanem a :: operatorral illene hasznalni) a masik pedig rendes osztalymetodust csinal. Annyi a difi asszem, hogy a statikus metodusbol itt meg lehet hivni a peldanymetodusokat is, csak a peldanyvaltozokban torteno valtozasok eltunnek a balfeneken, mivel nincs peldany.

Tudom, hogy a ruby terminologia kisse mas, de vannak akik igy jobban megertik.

--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.