首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby:从类方法生成实例对象

Ruby:从类方法生成实例对象
EN

Stack Overflow用户
提问于 2012-02-13 01:23:30
回答 2查看 147关注 0票数 2

MyClass对象具有a、b和c实例变量(请原谅我的模糊抽象)。此外,在编写这些类时,我希望能够设置abc,但我不希望我的用户能够这样做。

代码语言:javascript
复制
class MyClass
  attr_accessor :a, :b, :c
  private :a=, :b=, :c=
end

我希望通过以下两种方式之一实例化MyClass:

代码语言:javascript
复制
f = MyClass.create_from_foo foo_data
b = MyClass.create_from_bar bar_data

并在fb中获取b的实例。fb在实例化后是不可区分的,但当然是以不同的方式创建的。在这些调用之后,fb都有一个abc

我不希望MyClass通过new实例化。由于这两种创建方法都同样有效,我觉得“更喜欢”foo_data而不是bar_data,反之亦然。因此,我觉得我应该将new私有化,并且只允许这些类方法创建MyClass实例,以尝试公平竞争环境。换句话说,我试图避免:

代码语言:javascript
复制
#don't want this
f = MyClass.new foo_data
b = MyClass.create_from_bar bar_data #not quite "fair" to bar_data

那么,让我开始编写这些create_from_<type>类方法:

代码语言:javascript
复制
class MyClass

  #from earlier
  attr_accessor :a, :b, :c
  private :a=, :b=, :c=

  private_class_method :new

  def MyClass.create_from_foo foo_data
    #some parsing of foo_data and computation of a, b, and c
    myclass = MyClass.new
    myclass.a = a
    myclass.b = b
    #...
  end

  def MyClass.create_from_bar bar_data
    #again, computation of bar_data
    myclass.a = a
    myclass.b = b
    #...
  end
end

现在,如果你一直跟着,你会注意到我不能这样做!我把自己堵住了!

  • 我对new进行了私有化,因为我不希望我的用户以这种方式制作MyClass对象。我希望他们使用类方法。在类方法定义空间中,我基本上是一个用户,
  • 我私有化了a=b=c=,因为我不希望我的用户改变这些东西。(这将打破我的现实世界的例子)。然而,在定义类方法时,我还是一个用户。

所以,这就是我的工作。如何在类方法中创建“限制性”类的实例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-13 01:50:15

你有点纠结,你可以做得更简单一点。

代码语言:javascript
复制
class MyClass
  attr_reader :a, :b, :c

  private_class_method :new

  def initialize(a,b)
    @a = a
    @b = b
  end

  def self.create_from_foo foo_data
    #some parsing of foo_data and computation of a, b, and c
    myclass = new(a,b)
    #...
  end

  def self.create_from_bar bar_data
    #again, computation of bar_data
    myclass = new(a,b)
    #...
  end
end
票数 4
EN

Stack Overflow用户

发布于 2012-02-13 01:29:02

完全可以从其他类方法调用私有类方法。但是,在Ruby中,不能使用显式接收器调用私有方法(setters除外)。

因此,如果您只编写new而不是MyClass.new,它就会工作得很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9254506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档