ruby - 你如何从初始化方法调用类方法?

标签 ruby class matrix object-initializers

我试图在初始化方法期间调用类中的方法。这是不允许的吗?我最初在类之外有方法来尝试将它用作全局方法。当前方法试图返回创建的矩阵,然后初始化方法将返回的矩阵保存到实例变量中。

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

这样做会返回这个错误

`'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>'`

我希望它在类被实例化时创建一个矩阵的实例变量。我还尝试让 setMatrix 方法将矩阵直接保存到 @k 而不是返回矩阵,这给出了类似的错误。我还能做些什么来实现我想要的?

最佳答案

没有什么可以阻止您调用 initialize 中的方法,那里没有特殊的行为,但是您在这里调用的是另一个类中的 private 方法。

不知道为什么设置为private,有人观察了that seems to be a problem , 所以你总是可以暴力破解它:

matrix.send(:[]=, 1, 2, 3)

这看起来很困惑,按照该帖子中的建议对其进行修补可能有助于简化事情:

class Matrix
  def []=(row, column, value)
    @rows[row][column] = value
  end
end

您还可以将 Matrix 子类化为 MutableMatrix 并包含该方法。

请注意,Ruby 的方法命名约定是 underscore_style 并且在末尾包含一个显式的 return 不是必需的,这是暗示的。 m 一个人就可以完成这项工作。

关于ruby - 你如何从初始化方法调用类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757608/

相关文章:

python - 将大型 csv 转换为稀疏矩阵以在 sklearn 中使用

ruby-on-rails - 在 Yosemite 上安装 Ruby 1.9.2 时出错

java - 序列化后,Instanceof 对于同一个类返回 false

c++ - 使用函数指针在类之间传递数据

python - Numpy:高效的矩阵计算 A*xj 其中 xj 是 X 中的第 j 行

c++ - 如何让编译器为派生类选择方法的非模板版本?

Ruby 为一段文本着色

ruby - 使用 RVM 修复 Mac OS Sierra 上未初始化的常量 OpenSSL::Digest::DSS

ruby-aws 亚马逊 Mechanical Turk

php - 将 Gettext 字符串分配给类成员