Project1
标题:
小白问题,作用域
[打印本页]
作者:
DeathKing
时间:
2009-12-16 13:04
标题:
小白问题,作用域
本帖最后由 DeathKing 于 2009-12-18 17:52 编辑
这几天想要扩充一下数学库,又想加几个比较弱智的加密算法,结果弄巧成拙。运行时报 code_r[ii] = $a[iii]*$b[ii] 的 [] 没有找到方法。我的$a和$b都用了全局变量了{:nm_9:} ,code_r也没错啊……,求解。
module DMath
def self.code(a,b)
$a=$b={}
$a=a
$b=b
code_r=Array.new(2){Array.new(2,0)}
for iii in 0..2
for ii in 0..2
p code_r[ii]
code_r[ii] = $a[iii]*$b[ii]
end
end
return code_r
end
end
class Test
include DMath
p DMath.code([1,2,3],[4,5,6])
end
@a=Test.new
复制代码
作者:
紫苏
时间:
2009-12-16 13:33
直接运行这段代码没有报错,你提到的问题可能是由于在调用 DMath.code 时给 b 传递了一个不是数组类型的对象(或者其它没有 [] 方法的对象)而导致的,具体得看报错的详细信息(undefined method '[]' for ???)
作者:
DeathKing
时间:
2009-12-17 16:38
第19行提到了,我调用的是:p DMath.code([1,2,3],[4,5,6]) 难道是我传递错了{:nm_7:}
现在在学校的微机室{:nm_3:}
作者:
紫苏
时间:
2009-12-18 03:08
不是说了么,这段代码没报错,我还以为你在其它地方还有调用呢
作者:
DeathKing
时间:
2009-12-18 13:05
本帖最后由 DeathKing 于 2009-12-18 13:10 编辑
2.JPG
(20.03 KB, 下载次数: 0)
下载附件
保存到相册
2009-12-18 13:05 上传
1.JPG
(11.06 KB, 下载次数: 0)
下载附件
保存到相册
2009-12-18 13:05 上传
{:nm_3:} {:nm_7:}
单独运行的确不报错{:nm_7:} 。迷茫{:nm_2:} (整个模块的源码):
module DMath
def self.sum(a,b,*c)
sum_r=a+b
for i in 0..c.size-1
sum_r += c
end
return sum_r
end
def self.sub(a,b,*c)
sub_r=a-b
for i in 0..c.size-1
sub_r -= c
end
return sub_r
end
def self.div(a,b,*c)
div_r=(a/b).to_f
for i in 0..c.size-1
div_r /= c
end
return div_r
end
def self.mul(a,b,*c)
mul_r=a*b
for i in 0..c.size-1
mul_r *= c
end
return mul_r
end
def self.pow(a,b,*c)
pow_r=a**b
for i in 0..c.size-1
pow_r **= c
end
return pow_r
end
def self.abs(a)
return a if a >= 0
return -a if a < 0
end
def self.int(a)
return a.to_i
end
def self.str(a)
return a.to_s
end
def self.code(a,b)
$a=$b={}
$a=a
$b=b
$code_r=Array.new(2){Array.new(2,0)}
for iii in 0..2
for ii in 0..2
#p code_r[ii]
$code_r[iii][ii] = $a[iii].to_i* $b[ii]
end
end
return code_r
end
end
class Test
include DMath
p DMath.code([1,2,3],[4,5,6])
end
@a=Test.new
复制代码
作者:
紫苏
时间:
2009-12-18 13:41
这两段的 code 函数本就不一样嘛,顶楼在 p 的下方只是访问了 code_r 的一维,而楼上又变成了访问二维了…… [] 方法会检测传递进来的索引值是否越界,如果是则动态延长数组长度到(索引值+1),并用 nil 填充延长部分的数组元素~楼上这段代码报错就是因为当 for 循环中的 iii 被赋为 2 时,引用 code_r[2] 越界了,之后 code_r 数组被延长,code_r[2] 就返回了在索引 2 的位置上自动填充的那个 nil
所以对于这个 2×2 的数组,两个 for 循环的上限都应该是 1,或者用三个点的范围运算符,表示不包括上限本身(0...2)
作者:
DeathKing
时间:
2009-12-18 17:50
也是我的错,也算dz的错,for 一般都是用i做计数器的,dz的 [ i ] 就认为是斜体{:nm_7:}
所以后来我才会弄成iii{:nm_9:}
也就是我弄二维数组(3*3)的时候就错了?
$code_r=Array.new(2){Array.new(2,0)}
复制代码
应该是:
$code_r=Array.new(3){Array.new(3,0)}
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1