这是我的第一篇文章,我对编程/这个网站很新,所以如果我做错了什么/烦人,我会提前道歉。
我想找到一种方法来定义对象而不必为每个对象这样做。我想出了这个
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">, #
为了澄清我只是想知道我是否真的设法在这里创建对象,为什么在我尝试访问我的数组元素时,我得到了那些奇怪的反馈(有点似乎是访问内存或其他东西,但是这有点超出我的意见)
我提前感谢任何回复此事的人。
答案 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>