gpt4 book ai didi

Ruby-否则工作方法一旦在类中定义就会中断

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:18 25 4
gpt4 key购买 nike

我正在玩“流利的计算器”练习,但遇到了一个我不明白的问题。如果我在 irb(第一段代码)中独立定义一些测试方法,它们会起作用,但如果我在一个类中定义它们,我就会开始出现 NoMethodError,即使关于这些方法的所有内容和它们返回的内容看起来都是一样的。在一个类中定义这些方法会导致它们表现不同是什么意思?

独立定义:

1.9.3p484 :097 >   def one
1.9.3p484 :098?> if self.is_a? String
1.9.3p484 :099?> instance_eval "#{self} 1"
1.9.3p484 :100?> else
1.9.3p484 :101 > 1
1.9.3p484 :102?> end
1.9.3p484 :103?> end
=> nil
1.9.3p484 :104 > def two
1.9.3p484 :105?> if self.is_a? String
1.9.3p484 :106?> instance_eval "#{self} 2"
1.9.3p484 :107?> else
1.9.3p484 :108 > 2
1.9.3p484 :109?> end
1.9.3p484 :110?> end
=> nil
1.9.3p484 :111 > def plus
1.9.3p484 :112?> "#{self} +"
1.9.3p484 :113?> end
=> nil
1.9.3p484 :114 > one.class
=> Fixnum
1.9.3p484 :115 > two.class
=> Fixnum
1.9.3p484 :116 > plus.class
=> String
1.9.3p484 :117 > one.plus.two
=> 3

在类 Calc 中定义:

1.9.3p484 :024 > class Calc
1.9.3p484 :025?>
1.9.3p484 :026 > def one
1.9.3p484 :027?> if self.is_a? String
1.9.3p484 :028?> instance_eval "#{self} 1"
1.9.3p484 :029?> else
1.9.3p484 :030 > 1
1.9.3p484 :031?> end
1.9.3p484 :032?> end
1.9.3p484 :033?>
1.9.3p484 :034 > def two
1.9.3p484 :035?> if self.is_a? String
1.9.3p484 :036?> instance_eval "#{self} 2"
1.9.3p484 :037?> else
1.9.3p484 :038 > 2
1.9.3p484 :039?> end
1.9.3p484 :040?> end
1.9.3p484 :041?>
1.9.3p484 :042 > def plus
1.9.3p484 :043?> "#{self} +"
1.9.3p484 :044?> end
1.9.3p484 :045?> end
=> nil
1.9.3p484 :046 > Calc.new.one.class
=> Fixnum
1.9.3p484 :047 > Calc.new.two.class
=> Fixnum
1.9.3p484 :048 > Calc.new.plus.class
=> String
1.9.3p484 :049 > Calc.new.one.plus.two
NoMethodError: undefined method `plus' for 1:Fixnum
from (irb):49
from /Users/miles/.rvm/rubies/ruby-1.9.3-p484/bin/irb:12:in `<main>'

最佳答案

提示:看self.class

当您在全局命名空间中定义它时,您实际上是在 Object 类上定义方法,所有其他对象都继承自该类,因此 FixnumString 继承您的新方法.一旦将它们放入类中,FixnumString 就不再定义这些方法。

关于Ruby-否则工作方法一旦在类中定义就会中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22337576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com