Ruby 理解胁迫

Ruby 理解胁迫,ruby,matrix,coercion,Ruby,Matrix,Coercion,我已经提交了一个,它修改了矩阵类,以便可以使用实数执行加法: 矩阵[[25,93],-1,66]+5 矩阵类有一个方法+(),在本例中调用该方法 我还希望用户能够将操作顺序更改为 5+矩阵[[25,93],-1,66] 矩阵似乎支持*()方法的此操作顺序,我不确定如何为+()方法实现此操作。强制使用强制方法处理。此方法将返回两个元素,对于这两个元素,将重试给定的运算符/方法矩阵定义强制如下: def coerce(other) case other when Numeric re

我已经提交了一个,它修改了
矩阵
类,以便可以使用实数执行加法:

矩阵[[25,93],-1,66]+5

矩阵
类有一个方法
+()
,在本例中调用该方法

我还希望用户能够将操作顺序更改为

5+矩阵[[25,93],-1,66]


矩阵
似乎支持
*()
方法的此操作顺序,我不确定如何为
+()
方法实现此操作。

强制使用
强制
方法处理。此方法将返回两个元素,对于这两个元素,将重试给定的运算符/方法<代码>矩阵定义
强制
如下:

def coerce(other)
  case other
  when Numeric
    return Scalar.new(other), self
  else
    raise TypeError, "#{self.class} can't be coerced into #{other.class}"
  end
end
但是请注意,它并没有更改操作数的顺序,而是将数值转换为标量类。因此,ruby查看
5+矩阵[…]
将执行
Scalar.new(5)+矩阵[…]


Scalar
类在同一文件中定义,并定义自己的一组运算符,包括
+
和“-”。因此,您需要做的是去掉行
Scalar.Raise erroroperationnotdefined,“+”,@value.class,other.class
,并在此处强制执行您的代码,例如,使用
other+self
方法处理强制。此方法将返回两个元素,对于这两个元素,将重试给定的运算符/方法<代码>矩阵定义
强制
如下:

def coerce(other)
  case other
  when Numeric
    return Scalar.new(other), self
  else
    raise TypeError, "#{self.class} can't be coerced into #{other.class}"
  end
end
但是请注意,它并没有更改操作数的顺序,而是将数值转换为标量类。因此,ruby查看
5+矩阵[…]
将执行
Scalar.new(5)+矩阵[…]


Scalar
类在同一文件中定义,并定义自己的一组运算符,包括
+
和“-”。因此,您需要做的是去掉行
Scalar.Raise erroroperationnotdefined,“+”,@value.class,other.class
,并在这里强制执行您的代码,例如使用
other+self
这对于注释来说太长了,这是一种回答。但是,我想告诉你,不要这样做,而不是解释
#强制
是如何工作的,任何人都可以从文档中读到。我的意思是说

  • 不要在所有元素中添加一个数字来重载
    矩阵#+
    ,并且
  • 不要修改矩阵#强制
  • 原因是1。您认为您正在添加一种功能。但你也失去了一些东西。矩阵通常只能与相同维度的其他矩阵求和。如果你犯了一个错误,并试图总结不同维度的矩阵,或试图总结一个矩阵与一些无关的对象,你会得到一个错误。此错误是对程序员的服务。这是一个受欢迎的reminer,它允许我们尽早发现我们犯了一个错误,我们试图将一个不兼容的对象添加到矩阵中。这个错误使我们能够及早发现问题。如果您开始重载
    Matrix#+
    ,您将获得新的功能,但同时也会丢失警告,这种语言将变得更加脆弱。如果确实要为每个元素添加一个数字,请定义一个新方法,例如



    对于2,同样地,您正在破坏2个对象:
    Matrix::Scalar
    ,以及数值对象。你认为你在做一项服务,使矩阵变得更有用。但是写作

    Matrix[[1, 2], [3, 4]].map { |e| e + 5 }
    

    这一点也不难。依我看,通过重载
    +
    来增加这种语法是一种净损失。我知道你已经完成了这项工作,但是将其作为一个gem发布,不要用这个特性来污染内核。

    这太长了,无法发表评论,这是一种回答。但是,我想告诉你,不要这样做,而不是解释
    #强制
    是如何工作的,任何人都可以从文档中读到。我的意思是说

  • 不要在所有元素中添加一个数字来重载
    矩阵#+
    ,并且
  • 不要修改矩阵#强制
  • 原因是1。您认为您正在添加一种功能。但你也失去了一些东西。矩阵通常只能与相同维度的其他矩阵求和。如果你犯了一个错误,并试图总结不同维度的矩阵,或试图总结一个矩阵与一些无关的对象,你会得到一个错误。此错误是对程序员的服务。这是一个受欢迎的reminer,它允许我们尽早发现我们犯了一个错误,我们试图将一个不兼容的对象添加到矩阵中。这个错误使我们能够及早发现问题。如果您开始重载
    Matrix#+
    ,您将获得新的功能,但同时也会丢失警告,这种语言将变得更加脆弱。如果确实要为每个元素添加一个数字,请定义一个新方法,例如



    对于2,同样地,您正在破坏2个对象:
    Matrix::Scalar
    ,以及数值对象。你认为你在做一项服务,使矩阵变得更有用。但是写作

    Matrix[[1, 2], [3, 4]].map { |e| e + 5 }
    

    这一点也不难。依我看,通过重载
    +
    来增加这种语法是一种净损失。我知道你已经完成了这项工作,但是把它作为一个gem发布,不要用这个特性来污染内核。

    这是用
    强制
    方法完成的。它已经为带有数值的矩阵实现,所以所有这些都可以正常工作。你试过了吗?@BroiSatse是的,如果我运行一个单元测试,它只有在
    Fixnum
    结束时才通过,否则我会得到一个异常:
    ExceptionForMatrix::errorOperationNotDefined:Operation(+)无法定义:Fixnum op Matrix
    @caryswovelmy修改了代码,以便允许使用标量(实数)的操作。但是,只有当数字在末尾而不是在开头时,它才起作用。我希望它能双向运行。@migu-看看matrix.rb,l