繁体   English   中英

从Ruby中的类方法调用私有实例方法

Calling a private instance method from a class method in Ruby

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我可以创建一个可以通过类方法调用的私有实例方法吗?

class Foo
  def initialize(n)
    @n = n
  end
  private # or protected?
  def plus(n)
    @n += n
  end
end

class Foo
  def Foo.bar(my_instance, n)
    my_instance.plus(n)
  end
end

a = Foo.new(5)
a.plus(3) # This should not be allowed, but
Foo.bar(a, 3) # I want to allow this

抱歉,如果这是一个非常基本的问题,但我无法以谷歌的方式找到解决方案。

3 个回复

使用私有或受保护的实际上并没有在Ruby中做那么多。 您可以在任何对象上调用send并使用它拥有的任何方法。

class Foo
  def Foo.bar(my_instance, n)
    my_instance.send(:plus, n)
  end
end

你可以像塞缪尔所展示的那样做,但它确实绕过了OO检查......

在Ruby中,您只能在同一个对象上发送私有方法,并且只能保护同一个类的对象。 静态方法驻留在元类中,因此它们位于不同的对象(也是不同的类)中 - 因此您无法使用私有或受保护的方式。

您也可以使用instance_eval

class Foo
  def self.bar(my_instance, n)
    my_instance.instance_eval { plus(n) }
  end
end
4 Ruby:无法从方法调用类实例

我显然是Ruby的新手,并且对编程还是一个新手,非常感谢您的帮助。 这是我的代码段: 运行时,结果如下: $ ruby​​ wtf.rb 为什么我的呼叫在第一种情况下起作用,但在第二种情况下却不起作用? 是否因为它现在正在“测试”方法中寻找新的“玩家”变量? 如果 ...

6 Ruby:从实例调用类方法

在Ruby中,如何从该类的实例中调用类方法? 说我有 Truck.default_make行检索默认值。 但有没有提到Truck这样说的方法呢? 好像应该有。 ...

8 Ruby类用静态方法调用私有方法?

我有一个包含许多静态方法的类。 每个人都必须调用一个常用方法,但我试图不暴露后一种方法。 将其设为私有只允许从类的自己的实例访问? 受保护似乎不会解决这里的问题。 如何隐藏do_calc在静态上下文中被外部调用? (让它可以从前两个静态方法调用。) ...

9 在Ruby中调用Class中的实例方法

我对此非常困惑。 在编程Ruby书中,它说,“接收器在自己的类中检查方法定义” 所以类对象存储所有实例方法。 那为什么我不能从类中调用实例方法呢? 例如 我不能在ExampleClass中调用example_method。 但是,如果我在顶层定义一个方法,如下所示: ...

2015-03-30 20:51:08 4 4453   ruby
10 从Ruby中的实例方法调用受保护的类方法

我一直在重复这个烦人的主题。 假设我有一个定义实例方法和受保护的类方法的类。 实例方法必须调用类方法。 为此,我必须打破可见性规则并使用危险的“发送”功能。 像这样: 我发现这很糟糕,因为应该在类范围内使用类方法,因此应该在其中保持可见和可调用,对吗? 有没有其他方法可以在实例 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM