相关疑难解决方法(0)

"私人"是否有充分理由按照Ruby的方式工作?

我花了一段时间才了解私有方法在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)

ruby language-design private access-specifier

25
推荐指数
1
解决办法
4145
查看次数

Ruby:使用self关键字从内部调用私有方法

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可以用来避免名称与局部变量冲突,表示我想调用实例函数或引用实例变量.

ruby self private-members

10
推荐指数
1
解决办法
753
查看次数

有人可以帮助解释创建类的post_initialize回调(Sandi Metz)

我正在阅读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,因为它提供某种特殊功能?是否有一些其他红宝石内省方法可以用来查看发生了什么?

ruby

5
推荐指数
1
解决办法
338
查看次数

如何在控制台中调用ruby中的某个方法

假设我有两种方法的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)那件事.这可能吗?如果是这样,怎么样?

ruby

4
推荐指数
1
解决办法
944
查看次数