当我创建一个新对象时,它似乎有一个“值”,例如驻留在散列中的表示:
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应该是可序列化的。
//编辑:我找到了我真正搜索的内容:
一般说来,没有“价值”。我在我的问题中寻找的是对象在某些方法方面的行为。
如果我希望任何通用对象的行为“像数组一样”,在我的脑海中,我会想到:-通过array[]和数组块条目和array.push( << )或array.map{array.push}来访问内容。
我发现仅仅从数组继承是非常糟糕的。一种更好的方法是使用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将方法委托给值对象即可。
发布于 2013-08-23 01:44:04
在拼音中对象的“值”是什么?
这取决于对象。您可以在定义类时对其进行定义。irb在每条语句后显示的不是对象的“值”。它是结果对象的字符串表示。
这是什么"asd"?
它是object.to_s的结果,其中object是最后一条语句的结果对象。对象是一个抽象的概念,为了显示它,需要将它转换为您可以看到的东西,在本例中是一个字符串。irb将对象转换为字符串(通过to_s方法),以便您可以看到和理解它。
那"#“是什么?
您的新类没有自己的to_s方法,并且调用了其中一个祖先的to_s方法。我认为它是Module类的,它返回"#< class -name*pointer-to-the-object*>“
我想要的是一个散列中的对象,它的行为就像一个字符串。我该怎么做呢?
在类中定义to_s方法。
https://stackoverflow.com/questions/18386073
复制相似问题