设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1043|回复: 6
打印 上一主题 下一主题

[已经解决] 小白问题,作用域

 关闭 [复制链接]

Lv3.寻梦者

梦石
0
星屑
1195
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

跳转到指定楼层
1
发表于 2009-12-16 13:04:06 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 DeathKing 于 2009-12-18 17:52 编辑

这几天想要扩充一下数学库,又想加几个比较弱智的加密算法,结果弄巧成拙。运行时报 code_r[ii] = $a[iii]*$b[ii] 的 [] 没有找到方法。我的$a和$b都用了全局变量了{:nm_9:} ,code_r也没错啊……,求解。
  1. module DMath
  2.   def self.code(a,b)
  3.     $a=$b={}
  4.     $a=a
  5.     $b=b
  6.     code_r=Array.new(2){Array.new(2,0)}
  7.     for iii in 0..2
  8.       for ii in 0..2
  9.         p code_r[ii]
  10.         code_r[ii] = $a[iii]*$b[ii]
  11.       end
  12.     end
  13.     return code_r
  14.   end
  15. end

  16. class Test
  17.   include DMath
  18.   p DMath.code([1,2,3],[4,5,6])
  19. end

  20. @a=Test.new
复制代码

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更

Lv3.寻梦者

梦石
0
星屑
1195
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

7
 楼主| 发表于 2009-12-18 17:50:25 | 只看该作者
也是我的错,也算dz的错,for 一般都是用i做计数器的,dz的 [  i   ]  就认为是斜体{:nm_7:}

所以后来我才会弄成iii{:nm_9:}

也就是我弄二维数组(3*3)的时候就错了?
  1. $code_r=Array.new(2){Array.new(2,0)}
复制代码
应该是:
  1. $code_r=Array.new(3){Array.new(3,0)}
复制代码

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
6
发表于 2009-12-18 13:41: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)
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1195
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

5
 楼主| 发表于 2009-12-18 13:05:36 | 只看该作者
本帖最后由 DeathKing 于 2009-12-18 13:10 编辑



{:nm_3:} {:nm_7:}

单独运行的确不报错{:nm_7:} 。迷茫{:nm_2:} (整个模块的源码):
  1. module DMath
  2.   
  3.   def self.sum(a,b,*c)
  4.     sum_r=a+b
  5.     for i in 0..c.size-1
  6.       sum_r += c
  7.     end
  8.     return sum_r
  9.   end
  10.   
  11.   def self.sub(a,b,*c)
  12.     sub_r=a-b
  13.     for i in 0..c.size-1
  14.       sub_r -= c
  15.     end
  16.     return sub_r
  17.   end
  18.   
  19.   def self.div(a,b,*c)
  20.     div_r=(a/b).to_f
  21.     for i in 0..c.size-1
  22.       div_r /= c
  23.     end
  24.     return div_r
  25.   end
  26.   
  27.   def self.mul(a,b,*c)
  28.     mul_r=a*b
  29.     for i in 0..c.size-1
  30.       mul_r *= c
  31.     end
  32.     return mul_r
  33.   end
  34.   
  35.   def self.pow(a,b,*c)
  36.     pow_r=a**b
  37.     for i in 0..c.size-1
  38.       pow_r **= c
  39.     end
  40.     return pow_r
  41.   end
  42.   
  43.   def self.abs(a)
  44.     return a  if a >= 0
  45.     return -a if a <  0
  46.   end
  47.   
  48.   def self.int(a)
  49.     return a.to_i
  50.   end
  51.   
  52.   def self.str(a)
  53.     return a.to_s
  54.   end
  55.   
  56.   def self.code(a,b)
  57.     $a=$b={}
  58.     $a=a
  59.     $b=b
  60.     $code_r=Array.new(2){Array.new(2,0)}
  61.     for iii in 0..2
  62.       for ii in 0..2
  63.         #p code_r[ii]
  64.         $code_r[iii][ii] = $a[iii].to_i* $b[ii]
  65.       end
  66.     end
  67.     return code_r
  68.   end
  69.   
  70. end

  71. class Test
  72.   include DMath
  73.   p DMath.code([1,2,3],[4,5,6])
  74. end

  75. @a=Test.new

复制代码

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
4
发表于 2009-12-18 03:08:02 | 只看该作者
不是说了么,这段代码没报错,我还以为你在其它地方还有调用呢
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1195
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

3
 楼主| 发表于 2009-12-17 16:38:06 | 只看该作者
第19行提到了,我调用的是:p DMath.code([1,2,3],[4,5,6]) 难道是我传递错了{:nm_7:}
现在在学校的微机室{:nm_3:}

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 2009-12-16 13:33:14 | 只看该作者
直接运行这段代码没有报错,你提到的问题可能是由于在调用 DMath.code 时给 b 传递了一个不是数组类型的对象(或者其它没有 [] 方法的对象)而导致的,具体得看报错的详细信息(undefined method '[]' for ???)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-25 23:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表