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