J
John N. Alegre
I have a confusion in Ruby's way of dealing with "private" instance methods.
"Private" means that the method is accessible only within the class, and it
is callable only in "function form," with self (implicit or explicit) as a
receiver." "Protected" gives access to the method in subclasses.
as is the case in Java or Obj C
However ... here is some very simple code that is not doing what I
expect ...
####################################################
# Example One
# Works as expected
####################################################
/usr/bin/ruby -w
class MyClass
protected
def say
puts "Hello"
end
public
def sayit
self.say
end
end
class AClass < MyClass
end
puts "Start"
r = MyClass.new
r.sayit
t = AClass.new
t.sayit
#########################################
salamanca:~/Hack/Hack04/Ruby1 jna$ ./int.rb
Start
Hello
Hello
That is exactly as I expected with the subclass having access to a super
"protected" method.
####################################################
# Example Two
# Not as expected
####################################################
/usr/bin/ruby -w
class MyClass
private
def say
puts "Hello"
end
public
def sayit
self.say
end
end
class AClass < MyClass
end
puts "Start"
r = MyClass.new
r.sayit
t = AClass.new
t.sayit
#########################################
salamanca:~/Hack/Hack04/Ruby1 jna$ ./int.rb
Start
../int.rb:10:in `sayit': private method `say' called for #<MyClass:0x26148>
(NoMethodError)
from ./int.rb:19
What I expected to see here is the first call to r.sayit retruning "Hello"
as it is calling it's own "private" method. I expected to see the error on
the second call ot t.sayit.
What am I missing? This is not to the best of my knowledge the way things
are in Java.
Thanks
john
"Private" means that the method is accessible only within the class, and it
is callable only in "function form," with self (implicit or explicit) as a
receiver." "Protected" gives access to the method in subclasses.
as is the case in Java or Obj C
However ... here is some very simple code that is not doing what I
expect ...
####################################################
# Example One
# Works as expected
####################################################
/usr/bin/ruby -w
class MyClass
protected
def say
puts "Hello"
end
public
def sayit
self.say
end
end
class AClass < MyClass
end
puts "Start"
r = MyClass.new
r.sayit
t = AClass.new
t.sayit
#########################################
salamanca:~/Hack/Hack04/Ruby1 jna$ ./int.rb
Start
Hello
Hello
That is exactly as I expected with the subclass having access to a super
"protected" method.
####################################################
# Example Two
# Not as expected
####################################################
/usr/bin/ruby -w
class MyClass
private
def say
puts "Hello"
end
public
def sayit
self.say
end
end
class AClass < MyClass
end
puts "Start"
r = MyClass.new
r.sayit
t = AClass.new
t.sayit
#########################################
salamanca:~/Hack/Hack04/Ruby1 jna$ ./int.rb
Start
../int.rb:10:in `sayit': private method `say' called for #<MyClass:0x26148>
(NoMethodError)
from ./int.rb:19
What I expected to see here is the first call to r.sayit retruning "Hello"
as it is calling it's own "private" method. I expected to see the error on
the second call ot t.sayit.
What am I missing? This is not to the best of my knowledge the way things
are in Java.
Thanks
john