Я пытаюсь реализовать напуганную версию цепочки методов. Возврат экземпляра класса после каждого вызова функции прост, вы просто делаете
def chainable_method
some_code()
self
end
Моя идея состоит в том, что методы, которые вы можете вызывать, зависят от предыдущего вызова метода. Я пытаюсь добиться этого, возвращая объект, принадлежащий содержащему объекту. Содержащийся объект будет иметь несколько специальных методов, а затем реализует метод method_missing для возврата экземпляра содержащего объекта.
Изменить: дочерний объект имеет связанное с ним состояние, которое должно быть само по себе, а не родительское. Возможно, раньше было неясно, почему мне нужен целый экземпляр только для вызовов методов.
super не имеет значения в этом случае, потому что содержащийся объект не наследуется от содержащего объекта, и я бы все равно не хотел вызывать методы содержащего объекта для содержащегося объекта - я хочу вызывать методы содержащего объекта для самого содержащего объекта . Мне нужен содержащий объект, а не содержащий объектный класс.
Не уверен, что это возможно.
Изменить: все перефразировано, чтобы использовать «содержащий/содержащийся объект» вместо совершенно неправильного родительского/дочернего объекта. Кроме того, я использую 1.9.3, если это имеет значение. Версия значения не имеет, могу поменять если нужно.
Мое объяснение, вероятно, было неясным. Вот код:
class AliasableString
def initialize(string)
@string = string
end
def as(aka)
@aka = aka
end
def has_aka?
[email protected]?
end
# alias is a reserved word
def aka
@aka
end
def to_s
@string + (self.has_aka? ? (" as " + @aka) : "")
end
end
class Query
def initialize
@select_statements = Array.new
end
def select(statement)
select_statement = AliasableString.new(statement)
@select_statements.push(select_statement)
select_statement
end
def print
if @select_statements.size != 0
puts "select"
@select_statements.each_with_index {| select, i|
puts select
}
end
end
end
# Example usage
q0 = Query.new
q0.select("This is a select statement")
.select("Here's another one")
.as("But this one has an alias")
.select("This should be passed on to the parent!")
q0.print
Я еще не полностью реализовал print. Для AliasableString необходимо, чтобы @string и @aka были разделены, чтобы я мог разделить их позже.
Parent.new
, либо у вас уже есть экземпляр parent, и вы можете его вернуть. - person Aleksei Matiushkin   schedule 30.01.2014the child object doesn't inherit from the parent
...I want the parent instance, not the parent class
... ват. - person Jake Romer   schedule 30.01.2014AliasableString
получающим второй параметр: экземплярQuery
:select_statement = AliasableString.new(statement, self)
. - person Aleksei Matiushkin   schedule 30.01.2014