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

Project1

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

[已经解决] 执行p (test)脚本发生ArgumentError

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
帖子
51
跳转到指定楼层
1
发表于 2011-9-30 21:34:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
      10.times {
        test = Math.tan(12.409709)
        test = Math.sin(56.4385901)
        test = Math.cos(23.15829836)#测试电脑计算能力用
      }
      p (test) if Input.press?(Input::F6)
就是这个脚本,我想测试电脑对tan、sin、cos的计算速度。不过在执行 p (test) if Input.press?(Input::F6)  出现错误,说:
脚本‘Scene_Base’ 的第25行发生了ArgumentError . wrong number of arguments

点评

重新解释了一下……  发表于 2011-9-30 22:10

Lv1.梦旅人

Mr.Gandum

梦石
0
星屑
226
在线时间
2070 小时
注册时间
2007-1-31
帖子
3039

贵宾

2
发表于 2011-9-30 21:44:13 | 只看该作者
p后面的(test)
去掉括号。
回复

使用道具 举报

Lv3.寻梦者

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

贵宾

3
发表于 2011-9-30 21:45:25 | 只看该作者
本帖最后由 DeathKing 于 2011-9-30 22:28 编辑

  你的代码是在块(block)中定义了一个test变量,而这个变量的生命周期就只存在于块中。考虑下面代码:
  1. 10.times do
  2.   i = "Ditro am i"
  3. end

  4. p i  # <<- 此处发生NameError。
复制代码
  正确的写法如下:
  1. # 预先初始化此变量
  2. i = "no who"

  3. 10.times do
  4.   i = "Ditro am i"
  5. end

  6. p i  # Ditro am i
复制代码
  按照我们的预期,你的脚本应该发生NameError,但为什么你的脚却发生了ArgumentError呢?事实上,test是由Kernel模块提供的一个方法,原型如下:
  1. test(int_cmd, file1 [, file2] )
复制代码
  不用去考察test方法的实际意义,你只需要知道,test方法需要至少2个参数。而你的脚本中使用了一个“短命”的test变量,在10.times的迭代后,此变量随即消失了。因此,当使用p (test)的时候,test并不是你所期望的变量,而是Kernel类的那个方法,这是Ruby中的一个陷阱,Ruby中的诗歌模式允许你调用方法时不加上括号,这使得你区分一个变量和方法不甚容易。

  解决方法异常简单,在进行10次迭代前显式的初始化一下test变量,不过最好使用一个其他名字,比如my_test。

  提供一个简单的方法检测我的陈述,重定义Kernel#test方法:
  1. module Kernel
  2.   def test
  3.     p "You call the test method in Kernel module! "
  4.   end
  5. end
复制代码
  将此代码插入到你错误代码之前,再次运行错误的代码,看看结果吧!


拾遗

  我们假设除了Kernel定义的test方法以外,在当前的上下文(Context)中没有其他定义的test方法了。此时,环境中存放有一个test变量和Kernel#test()方法(图中并没有显式的注明括号)。

  当第一次调用test时,因为没有括号,Ruby会认为你调用的是一个变量,的确可以在内存中找到这个变量,一切Okay。迭代结束后,变量消失。此时环境中只有Kernel#test方法。

  第二次调用test,Ruby也会认为是变量(因为没有显式的加上括号),但并没有找到对应变量,Ruby便认为你是用了“诗歌模式”,因此调用Kernel#test方法。而Kernel#test方法要求传递至少2个参数,至此,错误便产生了。


参考资料:
[1]: http://szsu.wordpress.com/2010/09/07/continuation/
[2]: http://szsu.wordpress.com/2010/09/04/binding/
[3]: http://deathking.is-programmer.com/posts/29141.html

  前两个是我老板的文章,末一个是我搬过来的,如果wordpress的网页不能访问请访问第三个……感谢老板曾经给我将结果banding这个神奇的东西~~
排版党出没……再次整理中���
���

点评

第一次注意到Kernel模块里定义了test这个神奇的方法……  发表于 2011-9-30 22:12

评分

参与人数 2星屑 +120 收起 理由
苏小脉 + 60 国内做技术的都有这样的心态,指日便能赶上.
各种压力的猫君 + 60 =A= 这种认真程度真是让咱自愧不如.

查看全部评分


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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-9 01:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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