新人学ruby---alias,alias_method,alias_method_chain,undef,undef_method的区别

本文深入探讨了Ruby编程语言中alias、alias_method和alias_method_chain的用法,通过示例展示了如何为已存在的方法或全局变量设置别名,以及它们之间的区别。同时介绍了如何移除方法定义,提供了关键概念和技术细节。

今天在看calabash的wait_helpers.rb类时偶然看到了 “alias_method”。 不解,就顺便查下文档,发现几个相关关键字就索性做下记录,以便以后翻阅。


alias

alias 给已经存在的方法或全局变量设置一个别名,在重新定义已经存在的方法是,还能通过别名来调用原来的方法。alias方法的参数为方法名或者符号名。

语法:
alias 别名 原名 #直接使用方法
alias :别名 :原名 #使用符号名

例子:
a
代码:

    class AliasDemo
      $old = "old"
      def hello
        puts "old_hell0"
      end
    end

    class Demo2 < AliasDemo
      # 给hello方法取别名
      alias old_hello hello
      # 给全局变量$old取别名
      alias $new_in_old $old

      def hello
        puts "new_hello"
      end
    end

    obj = Demo2.new
    obj.hello
    obj.old_hello

    puts $new_in_old

输出结果:
new_hello
old_hell0
old

alias_method

作用和alias差不多,是Module的一个私有实例方法,只能用于给方法起别名,并且参试只能是字符串或者符号(alias 后面跟的是方法名或者全局变量)而且参数间是用“,”隔开(alias是用空格隔开)。

语法:
alias_method :new_name, :old_name

例子:
代码:

    class AliasMethodDemo
      def b
        puts "b"
      end

      alias_method :b_new, :b

      b = AliasMethodDemo.new
      b.b_new
      b.b
    end

输出结果:
b
b

alias_method_chain

技术文档总是会过时的,百度还能找到这个关键字的说明,然而已经不再使用了。


undef 和 undef_method

这两个方法效果的等效的,都是用于取消方法定义。undef不能出现再方法主体内。undef和rails一样,参数可以指定方法名或者符号名,undef_method后面参试只能是字符串或者符号 。如果一个类继承了某个父类,使用了这两个方法取消方法,会连带父类也会一起取消。

语法:
undef 方法名 #直接使用方法名
undef :方法名 #使用符号名
undef_method :方法名

remove_method

如果你只想移除子类的方法,而不想移除父类的方法,那么remove_method符合你需求。
语法:
remove_method :方法名

例子:
代码:

    class Parent
      def hello
        puts "In parent"
      end
    end
    class Child < Parent
      def hello
        puts "In child"
      end
    end

    c = Child.new
    c.hello

    class Child
      remove_method :hello # 移除子类的hello方法,父类还在
    end
    c.hello

    class Child
      undef_method :hello # 连父类的hello方法一起删除,不允许任何地方调用 'hello'
      # undef hello  # 等效上面的undef_method
    end
    c.hello

输出结果:
=>:in <top (required)>': undefined methodhello’ for # (NoMethodError)
from -e:1:in load'
from -e:1:in

In child
In parent

<think>好的,我需要处理用户关于MD_MSR_Undef的查询。首先,用户想知道它的定义、错误代码和含义。根据提供的引用内容,我需要检查是否有直接相关的信息。 查看引用[1],里面提到了UART_NR的定义,和CONFIG_SERIAL1相关,似乎和MD_MSR_Undef无关。引用[2]是关于cmd结构体的函数指针,也不相关。引用[3]涉及CONFIG_SHOW_BOOT_PROGRESS和show_boot_progress函数,可能不相关。引用[4]讨论重构代码和驱动执行时间,可能没有帮助。引用[5]解释了r14寄存器的用途,同样不相关。 看来提供的引用中没有直接提到MD_MSR_Undef。因此,可能需要根据常见情况推断。通常,类似Undef的错误可能涉及未定义指令或寄存器访问。例如,在ARM架构中,未定义指令会触发异常,可能涉及LR寄存器(引用[5])。MD_MSR_Undef可能是在访问未定义的MSR寄存器时触发的错误,错误代码可能对应特定的异常类型,如0x00000004。需要建议用户检查代码中的MSR指令和相关配置,或查阅具体芯片手册确认定义。</think>关于`MD_MSR_Undef`的定义和错误信息,根据现有引用内容分析如下: --- ### 1. **可能定义与背景** `MD_MSR_Undef`中的关键词`MSR`通常与**Machine-Specific Register(机器特定寄存器)**相关,而`Undef`表示**未定义**或未识别操作。在嵌入式系统或底层驱动开发中,此类错误可能由以下原因触发: - **未定义的寄存器访问**:尝试读取或写入不支持的MSR寄存器。 - **权限问题**:当前执行模式(如用户模式)无权访问特权寄存器[^5]。 - **指令编码错误**:操作码或寄存器编号不符合硬件规范[^1]。 --- ### 2. **典型错误场景与代码** 根据引用[5]中提到的ARM寄存器行为,当调用未定义指令或非法寄存器访问时,硬件可能触发**未定义指令异常**,此时`LR(R14)`会保存返回地址。例如: ```c // 假设尝试访问未定义的MSR寄存器 __asm__("mcr p15, 0, %0, c1, c0, 0" : : "r"(val)); // 若c1/c0组合未定义,可能触发MD_MSR_Undef ``` --- ### 3. **错误代码与含义** 若系统中定义了`MD_MSR_Undef`错误码,其可能对应以下含义: - **错误类型**:未定义指令或非法寄存器操作。 - **错误码值**:需查阅具体芯片手册(如ARM异常类型中,未定义指令异常码为`0x00000004`)[^5]。 - **调试建议**: - 检查`LR`寄存器保存的地址,定位触发异常的代码位置[^5]。 - 确认MSR寄存器编号是否符合当前处理器架构规范。 --- ### 4. **解决方法** 1. **验证寄存器定义**:确认使用的MSR寄存器在目标芯片的文档中明确定义。 2. **检查权限级别**:确保操作在特权模式(如内核态)下执行[^3]。 3. **代码重构**:若无法定位问题,可参考引用[4]的建议,重构相关驱动代码。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值