This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Controlling Access by Making Methods Private | ||
|---|---|---|
| Code | Expected | Actual |
class SecretNumber
def initialize
@secret = rand(20)
end
def hint
puts "The number is #{"not " if secret <= 10}greater than 10."
end
private
def secret
@secret
end
end
s = SecretNumber.new
s.secret |
NoMethodError: private method `secret' called for #<SecretNumber:0xb7c2e83c @secret=19> |
Error! (Exception?) Here's stdout: NoMethodError: private method `secret' called for #<SecretNumber:0xb7c28a24 @secret=19> from (irb):14 |
s.hint |
The number is greater than 10. |
The number is greater than 10. |
class LessSecretNumber < SecretNumber
def hint
lower = secret-rand(10)-1
upper = secret+rand(10)+1
"The number is somewhere between #{lower} and #{upper}."
end
end
ls = LessSecretNumber.new
ls.hint |
"The number is somewhere between -3 and 16." | "The number is somewhere between -3 and 16." |
ls.hint |
"The number is somewhere between -1 and 15." | "The number is somewhere between -1 and 15." |
ls.hint |
"The number is somewhere between -2 and 16." | "The number is somewhere between -2 and 16." |
class MyClass
def public_method1
end
def public_method2
end
protected
def protected_method1
end
private
def private_method1
end
def private_method2
end
end
class LessSecretNumber
def compare(other)
if secret == other.secret
comparison = "equal to"
else
comparison = secret > other.secret ? "greater than" : "less than"
end
"This secret number is #{comparison} the secret number you passed in."
end
end
a = LessSecretNumber.new
b = LessSecretNumber.new
a.hint |
"The number is somewhere between 17 and 22." | "The number is somewhere between 17 and 22." |
b.hint |
"The number is somewhere between 0 and 12." | "The number is somewhere between 0 and 12." |
a.compare(b) |
NoMethodError: private method `secret' called for #<LessSecretNumber:0xb7bfe13c @secret=6> |
Error! (Exception?) Here's stdout: NoMethodError: private method `secret' called for #<LessSecretNumber:0xb7bf8374 @secret=6> from (irb):43:in `compare' from (irb):55 |
class SecretNumber protected :secret end a.compare(b) |
"This secret number is greater than the secret number you passed in." | "This secret number is greater than the secret number you passed in." |
b.compare(a) |
"This secret number is less than the secret number you passed in." | "This secret number is less than the secret number you passed in." |
class MethodWithManySecrets :private # This method will show up in the RDoc, even though it's private. def secret_method_1 end # This method will not show up in the RDoc. def secret_method_2 # :nodoc: end end s.send(:secret) |
19 | 19 |