Project1

标题: 脚本求解释 [打印本页]

作者: zh99998    时间: 2009-2-15 02:11
标题: 脚本求解释
柳之一的错误提示脚本
  1. module ERRSettings
  2. #▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
  3. #请设置以下东东
  4. # 游戏测试的时候,是否保存错误信息?(true是false不是)
  5. SaveErrorData = true

  6. # 回溯跟踪错误的文件名
  7. BackTraceFileName = "Backtrace.txt"
  8. #▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
  9. end

  10. module RPG
  11. module_function
  12. def version
  13.    case
  14.      when defined? Hangup then 1.0
  15.      else 2.0
  16.    end
  17. end
  18. def debug?
  19.    $TEST or $DEBUG
  20. end
  21. end
  22. class Reset < Exception
  23. end
  24. class ScriptInterpreter

  25. include ERRSettings
  26. CallSystemError = true
  27. def run
  28.    Graphics.freeze
  29.    $scene = Scene_Title.new
  30.    $scene.main until $scene.nil?
  31.    Graphics.transition(RPG.version == 1 ? 20 : 30)
  32.    exit
  33. rescue Reset => exp
  34.    raise
  35. rescue SystemExit => exp
  36.    raise
  37. rescue Exception => exp
  38.    exception(exp)
  39.    exit
  40. end

  41. private

  42. def exception(exp)
  43.    save_backtrace(exp) if SaveErrorData or RPG.debug?
  44.    print(get_error_message(exp))
  45.    raise if CallSystemError and RPG.debug?
  46. end

  47. def get_error_message(exp)
  48.    if RPG.debug?
  49.      bt = BackTrace.get_backtraces(exp.backtrace)
  50.      
  51.      if exp.class.to_s=="SyntaxError"
  52.        $outexp="语法错误"
  53.      elsif exp.class.to_s=="NameError"
  54.        $outexp="变量未定义"
  55.      elsif exp.class.to_s=="NoMethodError"
  56.        $outexp="方法未定义"
  57.      elsif exp.class.to_s=="NoMemoryError"
  58.        $outexp="内存占有过大"
  59.      elsif exp.class.to_s=="ArgumentError"
  60.        $outexp="参数错误"   #如果愿意此处可以自定义添加
  61.      else
  62.        $outexp=exp.class.to_s
  63.      end

  64.      msg  = "◆ 发生错误\n"
  65.      msg += "\n66RPG提醒您:请养成备份游戏文件的习惯。\n \n"
  66.      msg += "错误类型 :\n\t#{$outexp}\n"
  67.      msg += "错误信息 :\n\t#{exp.message}\n" if exp.message
  68.      msg += "错误可能发生的相关位置 :"
  69.      bt.each do |i|
  70.        msg += " \n\t#{i.name} : 第 #{i.line_no} 行"
  71.        msg += " : #{i.method_name}" if i.method_name
  72.      end
  73.      msg += "  \n非常荣幸能为您发送错误报告\n"
  74.    else
  75.      msg  = "内部发生错误强制结束。\n"
  76.      msg += "66RPG提醒您:请养成备份游戏文件的习惯。\n"
  77.      msg += "▲错误报告文件「#{BackTraceFileName}」已经保存。\n\n"
  78.      msg += "  非常荣幸能为您发送错误报告\n"
  79.    end
  80.    msg
  81. end

  82. def save_backtrace(exp)
  83.    bt = BackTrace.get_backtraces(exp.backtrace)
  84.    
  85.      if exp.class.to_s=="SyntaxError"
  86.        $outexp="语法错误"
  87.      elsif exp.class.to_s=="NameError"
  88.        $outexp="变量未定义"
  89.      elsif exp.class.to_s=="NoMethodError"
  90.        $outexp="方法未定义"
  91.      elsif exp.class.to_s=="NoMemoryError"
  92.        $outexp="内存占有过大"
  93.      elsif exp.class.to_s=="ArgumentError"
  94.        $outexp="参数错误"   #如果愿意此处可以自定义添加
  95.      else
  96.        $outexp=exp.class.to_s
  97.      end
  98.    
  99.    msg  = "◆ #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}\n"
  100.    msg += "错误类型 :\n\t#{$outexp}\n"
  101.    msg += "错误信息 :\n\t#{exp.message}\n" if exp.message
  102.    msg += "错误可能发生的相关位置 :"
  103.    bt.each do |i|
  104.      msg += " \n\t#{i.name} : 第 #{i.line_no} 行"
  105.      msg += " : #{i.method_name}" if i.method_name
  106.    end
  107.    msg += "\n-------------66RPG-------------------\n"
  108.    File.open(BackTraceFileName, "a") do |file|
  109.      file.write(msg)
  110.    end
  111. end
  112. end

  113. # 回溯跟踪错误的类
  114. class BackTrace  
  115. BacktraceRegexp = /^Section([0-9]+):([0-9]+)(:in `(.+)')?$/
  116. def self.get_backtraces(bt)
  117.    r = []
  118.    bt.each do |i|
  119.      r << self.new(i)
  120.    end
  121.    r
  122. end  
  123. def initialize(line)
  124.    name, @line_no, @method_name =
  125.                                    BacktraceRegexp.match(line).to_a.values_at(1,2,4)
  126.    @name = get_section_name(name)
  127. end  
  128. attr_accessor :name
  129. attr_accessor :line_no
  130. attr_accessor :method_name  
  131. private
  132. def get_section_name(index)
  133.    $RGSS_SCRIPTS[index.to_i][1]
  134. end
  135. end
  136. begin
  137. si = ScriptInterpreter.new
  138. si.run
  139. end

复制代码

解释一下下面的句子
45行,140行,private
36行,rescue Reset => exp [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 神思    时间: 2009-2-15 02:21
Hangup
貌似是看是否定义了Hangup这么一个类。。
简单的看了一下.
应该是判断RM是VX还是XP
因为XP的10S异常就是Hangup

private
貌似就是不公开访问的函数..
例如
class A
private
def orz
return 1
end
end
a = A.new
p a.orz # Erro

rescue
捕捉异常..

至于后面的=>就不太清楚了


msg

RUBY的每个函数都会返回一个对象..

如果函数内无return
的话则返回最后一行的内容
例如

def a
  "囧"
  "orz"
end
p a # orz

a = []
a << 1
p a # [1]
<< == push

同msg
[LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: zh99998    时间: 2009-2-15 02:31
以下引用神思于2009-2-14 18:21:59的发言:
private
貌似就是不公开访问的函数..

如果是这样的话,那加上这个命令完全没有意义嘛
我把private前面加上个p,弹出ScriptInterpreter

作者: 神思    时间: 2009-2-15 02:33
怎么说呢...
可以内部访问

  1. class A
  2.   def a
  3.     return b
  4.   end
  5.   private
  6.   def b
  7.     return "aa"
  8.   end
  9. end
  10. a = A.new
  11. p a.a
复制代码

作者: zh99998    时间: 2009-2-15 02:36
上面的代码跟不加private有什么区别吗{/fd}
有那句p出的是"aa"没有也是"aa"
[LINE]1,#dddddd[/LINE]
还有,像Hangup这样的东西貌似F1里没有介绍,是怎么得到这个名字的
作者: 尤莉斯    时间: 2009-2-15 02:38
以下引用zh99998于2009-2-14 18:36:30的发言:

上面的代码跟不加private有什么区别吗
有那句p出的是"aa"没有也是"aa"



还有,像Hangup这样的东西貌似F1里没有介绍,是怎么得到这个名字的


[本贴由作者于 2009-2-14 18:37:46 最后编辑]


写程序不一定结果一样 意义就一样。。。 规范 原则 等很重要。。。

百度。。等

作者: zh99998    时间: 2009-2-15 02:40
没见过哪个规范里要private
RM默认脚本里也没见到有private
作者: 神思    时间: 2009-2-15 02:41
基本没区别
可能是个人癖好吧...

这.在下就不太了解了..
作者: 尤莉斯    时间: 2009-2-15 02:42
以下引用zh99998于2009-2-14 18:40:31的发言:

没见过哪个规范里要private
RM默认脚本里也没见到有private


。。。接口设计那些很重要的。。 很多东西不打算提供外部接口的。。 什么规范那些 很多都是软件工程里呢。。- -bb
作者: zh99998    时间: 2009-2-15 02:43
{/fd}楼上是真明白还是猜的
作者: 神思    时间: 2009-2-15 02:44
以下引用zh99998于2009-2-14 18:43:06的发言:

楼上是真明白还是猜的


[本贴由作者于 2009-2-14 18:44:22 最后编辑]

{/hx}你楼上的可是传说中的夏娜大人纳....

作者: 尤莉斯    时间: 2009-2-15 02:45
以下引用zh99998于2009-2-14 18:43:06的发言:

问一下楼上是真明白还是猜的
[本贴由作者于 2009-2-14 18:43:40 最后编辑]


那偶不明白也不是猜的  这样行否。。?

作者: zh99998    时间: 2009-2-15 02:46
夏娜……大人{/fd}
我错了{/pz}
作者: 神思    时间: 2009-2-15 02:48
其实我也不太明白..
其实接口...有不好一些么..?

你不用不就得了`= =```{/gg}
反正代码都是你自己写的````
作者: 尤莉斯    时间: 2009-2-15 02:48
以下引用zh99998于2009-2-14 18:43:06的发言:

问一下楼上是真明白还是猜的
[本贴由作者于 2009-2-14 18:43:40 最后编辑]


那偶不明白也不是猜的  这样行否。。?

作者: zh99998    时间: 2009-2-15 02:50
啊啊啊……夏娜大人对不起~~~~
那个……可以解释下楼顶【=>】的问题吗
作者: 尤莉斯    时间: 2009-2-15 02:54
- -咳咳 认真说下好了

其实 这些访问规则总共有
public protected private等几种

主要是修饰函数

比如
class MyLibrary
  def init
    init_graphics
    init_audio
  end
  private
  def init_graphics
  end
  def init_audio
  end
end

其实 你希望的只是 别人调用 init其实初始化 也就是另外2个函数 别人都不能访问,所以这里定义为private限制 外部对象访问。。。 仅提供init这一个接口就行了。。

- -不知道说的啥 orz 。。。 = =遁

ps : 思思好。。= = [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: 尤莉斯    时间: 2009-2-15 02:55
以下引用zh99998于2009-2-14 18:50:54的发言:

啊啊啊……夏娜大人对不起~~~~
那个……可以解释下楼顶【=>】的问题吗

p 下不就知道了。。? 你理解成 异常信息重定向到某变量就好了= =
作者: zh99998    时间: 2009-2-15 02:55
谢……基本上明白了
public貌似是个很XE的东西

貌似RGSS里还藏着很多F1里没说的东西啊……
这些东西Ruby手册里有吗
作者: 神思    时间: 2009-2-15 02:56
= =``
其实一开始C++里我也看到过类似的..也不太明白..

我想应该是指别人用你的脚本的时候来形成的一种封装吧...
作者: 雪流星    时间: 2009-2-15 03:26
private 就是隐藏用的
例如某些只需要在本类內調用的公用方法(utility method),而不想被外人拿来调用,就可以用private
这些公用方法大概就是一些进行私底下计算用的
[LINE]1,#dddddd[/LINE]
Public, Protected, Private Methods:

Instance methods may be public, private, or protected.

    *

      Public Methods: Methods are normally public unless they are explicitly declared to be private or protected. A public method can be invoked from anywhere, there are no restrictions on its use.
    *

      Private Methods: A private method is internal to the implementation of a class, and it can only be called by other instance methods of the same class.
    *

      Protected Methods: A protected method is like a private method in that it can only be invoked from within the implementation of a class or its subclasses. It differs from a private method in that it may be explicitly invoked on any instance of the class, and it is not restricted to implicit invocation on self.

These methods can be declared with three methods named public, private, and protected.. Here is the syntax
class Point
  # public methods go here

  # The following methods are protected
  protected

  # protected methods go here

  # The following methods are private
  private

  # private methods go here
end
[quote]
Here is a class with a private utility method and a protected accessor method:
[quote]
class Widget
  def x                       # Accessor method for @x
    @x
  end
  protected :x                # Make it protected

  def utility_method          # Define a method
    nil
  end
  private :utility_method     # And make it private
end

作者: 沉影不器    时间: 2009-2-15 06:16
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1