Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rails 3.2.12中为实例的方法定义一个只读的单例方法?_Ruby On Rails_Ruby_Singleton - Fatal编程技术网

Ruby on rails 如何在rails 3.2.12中为实例的方法定义一个只读的单例方法?

Ruby on rails 如何在rails 3.2.12中为实例的方法定义一个只读的单例方法?,ruby-on-rails,ruby,singleton,Ruby On Rails,Ruby,Singleton,在rails 3.2.12应用程序中,我们希望向实例的方法注入一个readonly方法,以将列标记为readonly。理想情况下,我们可以为应用程序中每个模型的实例的所有方法定义一个通用方法readonly 例如,@project是项目模型的一个实例。在@项目中有一个电话#。在方法注入之后,我们可以在运行时评估@project.phone.readonly(true或false)。如果应用程序中有另一个型号客户,我们可以执行@customer.name.readonly假设@customer是客

在rails 3.2.12应用程序中,我们希望向
实例的方法注入一个readonly方法,以将列标记为
readonly
。理想情况下,我们可以为应用程序中每个
模型的
实例的所有方法定义一个通用方法
readonly

例如,
@project
项目模型的一个实例。在
@项目
中有一个
电话#
。在方法注入之后,我们可以在运行时评估
@project.phone.readonly
(true或false)。如果应用程序中有另一个型号
客户
,我们可以执行
@customer.name.readonly
假设
@customer
客户
实例

我们觉得
singleton类
define\u方法
在这里可能会有所帮助。但我们不太明白它们将如何运作。有人能解释一下这个问题吗?谢谢你的帮助。

读一下这个

但我认为这是个坏主意,因为您的某些属性(电话、姓名等)可能是不可变或冻结的对象之一,因此会导致TypeError

范例

 1.9.3p125 :001 > number = 5.34
     => 5.34 
    1.9.3p125 :002 > def number.readonly?
    1.9.3p125 :003?>   true
    1.9.3p125 :004?>   end
    TypeError: can't define singleton method "readonly?" for Float
我建议你考虑下一个界面

@project.readonly?(:name)
也检查一下这个

它允许您在初始值设定项中执行类似的操作

class  ActiveRecord::Base
  def attr_readonly?(attr_name)
     self.class.readonly_attributes.include(attr_name)
  end
end
然后

 class Phone < ActiveRecord::Base
   attr_readonly :phone
 end
class电话

如果不需要attr_readonly功能,即不允许在创建对象后更改readonly属性,您可以像这样创建自己的模块,但使用另一个class_属性变量。

@user938363如果您需要定义一次方法并从任何实例调用它,那么您应该在类中定义该方法,不在单例实例中

class Float
  def readonly?
    true
  end
end

n = 1.234
n.readonly? # => true

不可变或冻结将是一个问题。某些数据类型(如float和integer)的对象本质上是不可变的还是fronzen的@project.readonly?(:phone)可以在我们的应用程序中使用。有没有一种方法可以定义它一次并从任何实例调用它?是的,它们本质上是不可变的,而且它们是从ruby 2.0中冻结的,这不是实例方法,而是类方法。。。只读?==适用于所有浮动