我花了一段时间才了解私有方法在Ruby中是如何工作的,这让我觉得非常尴尬.有谁知道私人方法是否有充分的理由按照它们的方式处理?这只是历史原因吗?还是实施原因?还是有很好的合理逻辑(即语义)?
例如:
class Person
private
attr_reader :weight
end
class Spy < Person
private
attr_accessor :code
public
def test
code #(1) OK: you can call a private method in self
Spy.new.code #(2) ERROR: cannot call a private method on any other object
self.code #(3) ERROR!!! cannot call a private method explicitly on 'self'
code="xyz" #(4) Ok, it runs, but it actually creates a local variable!!!
self.code="z" #(5) OK! This is the only case where explicit 'self' is ok
weight …Run Code Online (Sandbox Code Playgroud) class MyClass
def test
puts my_id
puts self.my_id
end
private
def my_id
115
end
end
m = MyClass.new
m.test
Run Code Online (Sandbox Code Playgroud)
该脚本产生一个输出:
115
priv.rb:4:in `test': private method `my_id' called for #<MyClass:0x2a50b68> (NoMethodError)
from priv.rb:15:in `<main>'
Run Code Online (Sandbox Code Playgroud)
使用self关键字调用内部方法与没有关键字之间有什么区别?
从我的Delphi和C#体验:没有区别,self可以用来避免名称与局部变量冲突,表示我想调用实例函数或引用实例变量.
我正在阅读Sandi Metz的POODR,并且遇到了一个我不太了解的编码原理.这是代码:
class Bicycle
attr_reader :size, :chain, :tire_size
def initialize(args = {})
@size = args[:size] || 1
@chain = args[:chain] || 2
@tire_size = args[:tire_size] || 3
post_initialize(args)
end
end
class MountainBike < Bicycle
attr_reader :front_shock, :rear_shock
def post_initialize(args)
@front_shock = args[:front_shock]
@rear_shock = args[:rear_shock]
end
end
mb = MountainBike.new(front_shock: 4, rear_shock: 5)
puts mb.size
puts mb.chain
puts mb.tire_size
puts mb.front_shock
puts mb.rear_shock
Run Code Online (Sandbox Code Playgroud)
此代码将输出1,2,3,4,5其各自的属性.我不明白的是方法查找.
当山地自行车被实例化时,因为它没有自己的initialize方法,它将沿着方法查找链向上移动到它的超类(Bicycle)上.但现在从那里开始,似乎Bicycle再次回到MountainBike的post_initialize方法.它不是继续推进方法链,而是如何回归?是post_initialize一个ruby关键字initialize,因为它提供某种特殊功能?是否有一些其他红宝石内省方法可以用来查看发生了什么?
假设我有两种方法的ABC类.
class ABC
def test
"test"
end
def display_test
puts test
end
end
Run Code Online (Sandbox Code Playgroud)
我只希望能够ABC.new.display_test从我的控制台(IRB)打电话(给我'测试')并且无法打电话ABC.new.test或者ABC.new.send(:test)那件事.这可能吗?如果是这样,怎么样?