ako predefinovat triedu atributu objektu
Lukas Svoboda
xsvobod4 na fi.muni.cz
Středa Srpen 25 19:28:54 CEST 2004
On Wed, Aug 25, 2004 at 04:47:36PM +0200, Peter Kruty wrote:
> Zdravim,
>
> mam nasledujuci kod:
>
> class A
> attr_accessor :pole
>
> class << @pole
> def each_positive
> self.each do |item|
> if item > 0 then
> yield item
> end
> end
> end
> end
> end
>
> a = A.new
>
> a.pole = [1, -3, 3, -5, 0, 0]
>
> a.pole.each_positive do |i|
> puts i
> end
>
> Zaujimalo by ma preco toto nefunguje. Kde mam chybu, resp. co robim zle.
> Pravdepodobne som nieco zle pochopil. Akt o teda ide ako pridat do triedy
> atributu "pole" nejaky iterator (alebo obecne metodu ci atribut), ale iba do
> triedy tejto konkretnej instancie, cize akoby pridat to ibe tejto instacii.
> Samozrejme to mozem obist vytvorenim podtriedy, ale zaujimalo by ma ci to
> naznacenym sposobom.
je to v tom, ze "attr_accessor :pole" za tebe definuje dve metody:
def pole=(t)
@pole = (t)
end
def pole
@pole
end
takze radek tveho kodu:
a.pole = [1, -3, 3, -5, 0, 0]
zrusi to co v prom. @pole bylo.
Tak jak jsi to asi myslel se to da zapsat napr:
cass A
attr_accessor :pole
def pole=(newvalue)
@pole = newvalue
class << @pole
def each_positive
self.each do |item|
if item > 0 then
yield item
end
end
end
end
end
end
a = A.new
a.pole = [1, -3, 3, -5, 0, 0]
a.pole.each_positive do |i|
puts i
end
Lukas
Další informace o konferenci Ruby