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