Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 重写Postgres数组类型移位运算符_Ruby On Rails_Arrays_Ruby_Postgresql_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 重写Postgres数组类型移位运算符

Ruby on rails 重写Postgres数组类型移位运算符,ruby-on-rails,arrays,ruby,postgresql,ruby-on-rails-4,Ruby On Rails,Arrays,Ruby,Postgresql,Ruby On Rails 4,是否可以重写该方法在Array类中定义的,因此您不能在模型中执行该操作 实现这一点的一种方法是通过混合 module WithShift def << arg # do something end end def hours read_attribute("hours").extend(WithShift) end 带换档的模块 def该方法是在Array类中定义的,因此不能在模型中这样做 实现这一点的一种方法是通过混合 module WithShift

是否可以重写该方法在Array类中定义的
,因此您不能在模型中执行该操作

实现这一点的一种方法是通过混合

module WithShift
  def << arg
    # do something 
  end
end


def hours
  read_attribute("hours").extend(WithShift)
end
带换档的模块

def该方法是在Array类中定义的,因此不能在模型中这样做

实现这一点的一种方法是通过混合

module WithShift
  def << arg
    # do something 
  end
end


def hours
  read_attribute("hours").extend(WithShift)
end
带换档的模块

def基于@ismael的答案,在ruby
=
中是setter方法名称的一部分

此代码

def小时数=arr
结束

创建一个名为
hours=
的方法,而在ruby中,基于@ismael的答案构建的
=
是setter方法名称的一部分

此代码

def小时数=arr
结束

创建一个名为
hours=
的方法,而
每次使用hours属性时包含模块是否会产生性能/内存成本?是的,大约慢15倍。但是可以忽略不计,除非你多次调用这个方法。还要注意,
include
不起作用。实际上,您要做的是使用
extend
。我已经编辑了我的答案,并添加了一个基准测试。每次使用小时属性时,包括模块是否有性能/内存成本?是的,大约慢15倍。但是可以忽略不计,除非你多次调用这个方法。还要注意,
include
不起作用。实际上,您要做的是使用
extend
。我已经编辑了我的答案并添加了一个基准
def hours<<(val)
  super(# do some stuff before pushing)
end
module WithShift
  def << arg
    # do something 
  end
end


def hours
  read_attribute("hours").extend(WithShift)
end
require 'benchmark/ips'
module WithShift
  def << arg
  end
end
def with_extend; [1,2,3].extend(WithShift); end

def base; [1,2,3]; end

Benchmark.ips do |x|
  x.report("base") { base }
  x.report("with extend") { with_extend }
  x.compare!
end


Calculating -------------------------------------
                base      5.506M (± 9.1%) i/s -     27.415M in   5.022561s
         with extend    349.984k (± 7.6%) i/s -      1.769M in   5.081799s

Comparison:
                base:  5505897.2 i/s
         with extend:   349984.1 i/s - 15.73x slower