ran*_*eme 1 ruby class matrix object-initializers
我试图在其初始化方法中调用类中的方法.这是不允许的?我最初在类之外使用了方法来尝试将其用作全局方法.当前方法尝试返回创建的矩阵,然后initialize方法将返回的矩阵保存到实例变量中.
class Member
def setMatrix(a, i, l)
puts "here"
m = Matrix.zero(6)
m[0,0] = a*l**2/i
m[0,3] = -a*l**2/i
m[1,1] = 12
m[1,2] = 6*l
m[1,4] = -12
m[1,5] = 6*l
m[2,1] = 6*l
m[2,2] = 4*l**2
m[2,4] = -6*l
m[2,5] = 2*l**2
m[3,0] = -a*l**2/i
m[3,3] = a*l**2/i
m[4,1] = -12
m[4,2] = -6*l
m[4,4] = 12
m[4,5] = -6*l
m[5,1] = 6*l
m[5,2] = 2*l**2
m[5,4] = -6*l
m[5,5] = 4*l**2
return m
#@k = m
end
def initialize(a, i, l)
@area = a
@i = i
@length = l
@k = setMatrix(a, i, l)
end
end
Run Code Online (Sandbox Code Playgroud)
这样做会返回此错误
`'setMatrix': private method '[]=' called for #<Matrix:0x00000001186e00> (NoMethodError)
from truss_solver.rb:71:in 'initialize'
from truss_solver.rb:86:in 'new'
from truss_solver.rb:86:in 'block in <main>'
from truss_solver.rb:85:in 'each'
from truss_solver.rb:85:in '<main>'`
Run Code Online (Sandbox Code Playgroud)
我希望它在实例化类时创建矩阵的实例变量.我也试过让setMatrix方法直接将矩阵保存到@k而不是返回矩阵,这也给出了类似的错误.我怎么做才能达到我的目的?
没有什么可以阻止你调用其中的方法initialize,那里没有特殊的行为,但你在这里调用的是另一个类中的私有方法.
我不知道为什么会这样private,有些人观察到这似乎是一个问题,所以你总是可以强制它:
matrix.send(:[]=, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
这似乎很混乱,并按照该帖子中的建议修补它可能有助于简化事情:
class Matrix
def []=(row, column, value)
@rows[row][column] = value
end
end
Run Code Online (Sandbox Code Playgroud)
你也可以继承Matrix来MutableMatrix的,包括该方法.
作为一个注释,Ruby的方法命名约定是underscore_style包括一个明确return的最终是没有必要的,这是隐含的.m独自完成这项工作.