2013-09-06 3 views
-1

Я хочу, чтобы создать метод preload! взрыва, который принимает аргумент и модифицирует его так:Как создать метод взрыва, который изменяет аргумент

hash = Hash.new 
preload! hash 
# => Now `hash` should have some value 

Как я могу это сделать?

def preload! param 
    param = # Some values 
end 

я говорил this, но я не собираюсь инкапсулировать preload! в Hash классе.

+1

Учитывая, что ваш метод ** должен быть инкапсулирован в класс, я не уверен, что вы просите ясно. – depa

+0

@depa Я не хочу, чтобы метод предварительной загрузки определялся в классе Hash и изменял его с помощью 'self.value =' kinda trick. Надеюсь, вы получите это – shiva

+0

Если нет звонящего, чтобы изменить, удар не имеет смысла. –

ответ

1

Вы можете изменить объект, передаваемый в качестве аргумента, но вы должны использовать соответствующие методы для изменения приемника:

def preload! hash 
    hash.replace(foo: 1, bar: 2) 
end 

h = {} 
preload! h 
h #=> {:foo=>1, :bar=>2} 

Назначение нового хэша к hash внутри preload! влияет только на hash переменного внутри метода, не h переменных снаружи:

def preload! hash 
    hash = {foo: 1, bar: 2} # doesn't work as expected 
end 
0

Попробуйте это:

def preload! param 
    param.replace(<key value pair that you need>) 
end 

hash = Hash.new # hash = {} 

preload! hash  # Now hash should have some value 
+0

Вы должны определить метод * перед тем, как его вызывать. – Stefan

+0

К сожалению, просто используется код OP. –

+0

Как было предложено @Stefan, для изменения приемника следует использовать правильные методы. Вместо этого замените здесь правильный метод, а не слияние !. Отредактировал мой ответ. –

0

Зависит от того, что вы пытаетесь сделать, но instance_eval должен дать вам, что гибкость

def mutator! object 
    object.instance_eval do 
    def to_s 
     'bonk' 
    end 
    end 
end 

h = {} 
h.to_s # => {} 
mutator! h 
h.to_s # => bonk 
0

То, что вы пытаетесь, плохо пахнет. Вместо того, чтобы модифицировать свои аргументы, вы должны Prolly сделать что-то вроде этого

class HashPreloader 
    attr_reader :hash 

    def initialize(hash) 
    @hash = hash || {} 
    preload! 
    end 

    private 

    def preload! 
    # do your magic 
    end 
end 

А потом просто

hash = HashPreloader.new.hash 

Для дальнейшей разработки, я должен был бы знать больше о прецеденте. Что вы на самом деле пытаетесь сделать.

Смежные вопросы