当我创建一个新对象时,它似乎有一个“值”,例如驻留在哈希中的表示:
h = { str: String.new("asd") } # => {:str=>"asd"}
或只是在irb:
String.new("asd")
=> "asd"
怎么做的?这是什么“asd”?
当我创建自己的课程时:
class A; def initalize(varl); end; end;
a = A.new("asd")
=> #<A:0x007fab7c2fe250>
那是什么“#”?我想要的是一个哈希内部的对象,例如,行为就像一个字符串。像这样:
hash = {str: A.new("asd")}
hash[:str] # => "asd"
hash[:str].my_method
我该怎么做?我不想继承String。我想对其他类型的其他类型做这个。
更新
我真正想做的是构建一个Hash,其中键和值是“某种”整数,字符串和数组,但有我自己定义的方法:
hash = {a: MyArray.new([:x,:y]), b: MyString.new("asdasd")}
hash[:a] # => [:x,:y]
hash[:b] # => "asdasd"
hash[:b].my_method
实际上,散列应该可以为ActiveRecord序列化。
//编辑: 我发现了我在搜索的内容:
在genereal中没有“价值”。我在我的问题中寻找的是一些对象在某些方法中的行为。
如果我想让任何一般对象表现得“像一个数组”,在我的脑海里有一些我想到的东西: - 通过array []和array&lt;&lt;访问内容entry和array.push(entry)或array.map {block}。
我发现从Array继承是非常糟糕的。更好的方法是使用forwardable并将这些方法转发给该对象的属性。
例如:
class Answer::Array
attr_accessor :value
extend Forwardable
def_delegator :@value, :inspect
def_delegator :@value, :to_s
def_delegator :@value, :[]
def_delegator :@value, :[]=
def_delegator :@value, :each
def_delegator :@value, :map
def initlialize
@value = []
end
def my_method
some_code
end
end
因此,要让对象的行为与任何其他“原始”对象一样,只需使用Forwardable将方法委托给值对象。
答案 0 :(得分:4)
字符串表示来自名为inspect
的方法,它以字符串格式表示您的对象。
class A
def initialize(varl)
@varl = varl
end
def inspect
"An instance of A containing #{@varl.inspect}"
end
end
A.new "abc" # => An instance of A containing "abc"
{key: A.new("abc")} # => {:key=>An instance of A containing "abc"}
class A
def inspect
@varl.inspect
end
end
a = A.new "abc"
a # => "abc"
答案 1 :(得分:0)
我相信当您执行#to_s
h[:str]
您可以通过以下方式使用自己的类来模拟这个:
1.9.3p392 :012 > class A
1.9.3p392 :013?> attr_accessor :varl
1.9.3p392 :014?> def initialize(varl)
1.9.3p392 :015?> self.varl = varl
1.9.3p392 :016?> end
1.9.3p392 :017?> def to_s
1.9.3p392 :018?> varl
1.9.3p392 :019?> end
1.9.3p392 :020?> end
=> nil
1.9.3p392 :021 > h = {str: A.new("asd") }
=> {:str=>asd}
1.9.3p392 :023 > h[:str]
=> asd
答案 2 :(得分:0)
ruby中对象的“值”是什么?
这取决于对象。您在定义类时定义它。 irb在每个语句后显示的内容不是对象的“值”。它是结果对象的字符串表示。
这是什么“asd”?
这是 object .to_s的结果,其中 object 是上一个语句的结果对象。 对象是一个抽象概念,为了显示它,它需要转换为你能看到的东西,在这种情况下是一个字符串。它是将对象转换为字符串(通过to_s方法)的irb,以便您可以查看和理解它。
那是什么“#”?
您的新类没有自己的to_s方法,并且调用了其中一个祖先的to_s方法。我认为它是Module类,它返回“#&lt; class-name :*指向对象*&gt;”
我想要的是哈希中的对象,其行为类似于字符串。我怎么能这样做?
在班级中定义to_s方法。