2011/4/20 Gastón Kleiman <[email protected]>:
> 2011/4/20 Nicolás Sanguinetti <[email protected]>:
>> BTW, esto da para otro thread :) Y da para otro momento que tenga un
>> poco más de tiempo de escribir, no quiero sonar pedante, simplemente
>> que tengo que terminar algo medio apurado :(
>
> Si alguno está ansioso, les paso un interesante artículo [1] de Jamis
> Buck sobre la diferencia entre public/private/protected en Ruby.
>
> [1]: http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby

Eso! Gracias, ayer estaba a mil y no me daba para buscar artículos.
Hay otro detalle más, igual. Protected en realidad no es que "solo
funciona con self como receiver". Funciona con cualquier instancia de
la misma clase de self (obviamente, self incluído) como receiver
explícito.

Por ejemplo:

class Foo
  def b(receiver)
    receiver.a
  end

  def a
    "bar"
  end
  protected :a
end

a1 = Foo.new
a1.b(a1) #=> "bar"
a1.instance_eval { b(self) } #=> "bar"

a2 = Foo.new
a2.b(a1) #=> "bar"

class Bar
  def a
    "BAM"
  end
  protected :a
end

b1 = Bar.new
a1.b(b1) #=> NoMethodError: protected method `a' called for #<Bar>

El "problema" es que si los usás como los de Java/etc, no vas mucha
diferencia, excepto que trates de hacer self.some_private_method,
porque no podés pasarle el receiver explícito. Pero fuera de ese
detalle, siempre podés tratarlos igual, y casi que no te das cuenta…

De todas formas, a lo que iba con "ruby no tiene protected" es que, en
realidad, no debería usarse el protected en ruby. Entiéndase, en el
único caso en el que querés que algo sea protected, es que una
instancia de una clase pueda llamar métodos de otra, pero querés que
el método no sea públicamente visible. En como 3 años desde que
aprendí la diferencia, sólo use protected 2 veces, y es discutible si
no era porque el diseño era malo.

Por lo general, lo que querés, es private. Y bueno, con send, lo de
private es totalmente ignorable, excepto como documentación (a esto
iba con que ruby "casi que tampoco" tiene private.)

Saludos,
-foca



> Saludos,
>
> Gastón
>
> PD: Me acabo de dar cuenta que esto llegó a RubyArg. Para la próxima
> estaría mejor usar RubySur =)
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a