这些物品是?打印时为什么它们看起来像那样?

时间:2016-04-29 14:34:42

标签: ruby class oop object iteration

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

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

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

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

它似乎有用,[3] .description返回“我是三”,但这是否意味着三/一[3]作为自己的对象存在而不是数组的元素?

此外,如果我尝试:

puts a[3]

我明白了:

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

为了澄清我只是想知道我是否真的设法在这里创建对象,为什么在我尝试访问我的数组元素时,我得到了那些奇怪的反馈(有点似乎是访问内存或其他东西,但是这有点超出我的意见)

我提前感谢任何回复此事的人。

2 个答案:

答案 0 :(得分: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) }

答案 1 :(得分:-1)

是的,你已经创建了对象。它就是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>