Когда я создаю новый объект, он, кажется, «значение», представление, например, находится в хэш:Что такое «значение» объекта в рубине?
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. Я хочу сделать это и для других типов с другими представлениями.
Update:
Что я действительно хочу сделать, это построить хэш, где ключи и значения являются «своего рода» Целые, струнных и массивам, но имеют свои собственные определенные методы:
hash = {a: MyArray.new([:x,:y]), b: MyString.new("asdasd")}
hash[:a] # => [:x,:y]
hash[:b] # => "asdasd"
hash[:b].my_method
Фактически, хэш должен быть сериализуемым для ActiveRecord.
// Edit: я узнал, что я acutally искал:
Там нет "значения" в genereal. В моем вопросе я искал поведение объекта с точки зрения некоторых методов.
Если я хочу любой общий объект вести себя «как массив», на мой взгляд, есть вещи, которые я думал: - доступ к содержимому с помощью массива [] и массив < < запись и Array.push (вход) или array.map {блок}.
И я узнал, что очень плохо просто наследовать от Array. Гораздо лучше, если вы используете переадресацию и пересылаете эти методы в атрибут этого объекта.
Например:
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 делегировать методы для объекта значения.
Итак, что же знает хэш, если называть t_s или to_a или to_i? Я имею в виду: он может также представлять собой объекты, которые я хочу представить в виде массива. – roman
Все имеет '# to_s', оно определено в' Object'. Поэтому всегда будет '# to_s'. –
Я думаю, что '# inspect' вызывается. – Stefan