【问题标题】:Are these objects? Why do they look like that when I print them?这些是物体吗?为什么我打印它们时它们看起来像那样?
【发布时间】:2016-08-24 18:37:04
【问题描述】:

这是我的第一篇文章,我对编程/这个网站还很陌生,所以如果我做错了什么/烦人,我提前道歉。

我想找到一种方法来定义对象,而不必为每个对象都这样做。我想出了这个

class Number
  def initialize(name)
    @name = name
  end

  def description
    puts "I'm #{@name} "
  end
end

a = ["zero", "one","two", "three", "four"]

for i in (0..5) do 
  a[i] = Number.new(a[i])
end

a[3].description

我希望有人能告诉我我创造了什么样的科学怪人怪物?

似乎可行,a[3].description 返回“我是三岁”,但这是否意味着 three/a[3] 作为其自己的对象而不是数组的元素存在?

如果我尝试这样做:

puts a[3]

我明白了:

<Context::Number:0x000000009b7fd0 @name="three">, #

为了澄清,我只想知道我是否真的设法在这里创建了对象,以及为什么当我尝试访问我的数组的元素时,我得到了奇怪的反馈(有点像它访问内存之类的东西,但是这有点超出我的范围)

提前感谢任何回复此问题的人。

【问题讨论】:

    标签: ruby class oop object iteration


    【解决方案1】:

    所有对象都是独立存在的,无论它们是否包含在其他对象中,例如 Array 实例。

    关于这个:

    <Context::Number:0x000000009b7fd0 @name="three">, #
    

    ...你的意思是当你 puts a[3] 而不是 puts a 时你得到了那个?

    Object 及其子类的每个实例都有一个to_s 方法,该方法返回对象的字符串表示形式。由于您没有在 Number 类中覆盖它,因此它使用了 Object 类中定义的默认实现。它正在向您展示:

    1) 类名(我假设您在名为 Context 的类或模块中定义了 Number)

    2) 对象 id(Ruby 运行时中的唯一 id)

    3) 其实例变量的字符串表示

    另外,关于这个:

    a = ["zero", "one","two", "three", "four"]
    

    这是等效的并且更容易键入(我使用 2 个空格以提高可读性):

    %w(zero  one  two  three  four)
    

    另外,正如 Ilya 指出的,map 将简化您的代码。我会走得更远,并推荐这样做来进行数组初始化:

    a = %w(zero  one  two  three  four).map { |s| Number.new(s) }
    

    【讨论】:

    • 是的,我的意思是放了 [3]。谢谢顺便说一句,这消除了我的很多困惑!如果我可以再问几个问题?每次我运行代码时对象ID都会改变有什么原因吗?因为这也是我每次运行并执行“puts a[3]”时发生的情况,所以我粘贴在问题中的代码就是我所写的全部内容;知道类名是如何变成 Context 的吗?
    • 对象id本身没有任何意义(例如,它们不是根据对象的内容计算出来的),只是作为一个值存在,Ruby可以用它来识别内存中的对象。因此,没有必要或保证它们在您的程序运行中保持一致。
    • 关于Context,我不知道...这是您文件中的唯一代码,您是否直接在命令行上运行该文件,如ruby my_file.rb?如果没有,那怎么办?
    • 不是对象的ID。这是它的内存地址。
    • 啊,好吧,我已经弄清楚了“上下文”的事情;我在使用命令行 via 和 codeacademy 的控制台窗口之间波动(就像我说我是编程新手 ^_^ )并且使用 cmd 时问题消失了。再次感谢您的所有帮助,我可以说我对 stackoverflow 的第一次体验非常积极
    【解决方案2】:

    是的,您已经创建了对象。这就是 Ruby 将类表示为字符串的方式。

    class MyClass
      attr_accessor :one, :two
    
      def initialize(one, two)
        @one, @two = one, two
      end
    end
    
    my_class = MyClass.new(1, 2)
    
    my_class.to_s            # #<MyClass:0x007fcacb8c7c68>
    my_class.inspect         # #<MyClass:0x007fcacb8c7c68 @one=1, @two=2> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多