2012-04-26 4 views
0

Я не знаю, как точно это сказать, но я пытаюсь определить многие переменные, а затем переопределить их без перезаписи каждой из многих переменных и создания избыточного кода в каждом новом блоке, который я пишу. Переменные определяют элементы массива из нескольких баз данных. Вот сокращенных пример того, что я работаю с:Ruby: (re) определяющие переменные из другого блока/метода?

def lots_of_vars(array) 
    name = array[1] 
    membership = array[2] 
    spouse = array[3] 
    .... 
    lap12 = array[36] 
end 

def second_block 
    #database1 => [ "Randy", true, "Nancy", 2, 17, false... 
    lots_of_vars(database1) 
    return unless membership 
    puts "Lap progress for #{name} and #{spouse}: #{lap1}, #{lap2}... #{lap12}..." 
end 

def third_block 
    #database2 => [ "Steven", true, nil, 0, 5, false... 
    lots_of_vars(database2) 
    return unless spouse.empty? or spouse.nil? 
    puts "Weekly progress for #{name}: #{lap1}, #{lap5}, #{lap6}, #{lap10}..." 
end 

Второй и третий блок необходимо все переменные, определенные из первого блока/метода. Но как передать все эти переменные? Один пример, который я прочитал предложил мне передать их все в качестве параметров, таких как:

def second_block(name, membership, spouse...) 

, но это сделало бы так же беспорядок, как определение каждой переменной в два раза в обоих блоках. Каков простой и суровый подход к такой ситуации? Пожалуйста, дайте мне знать, если мне нужно прояснить что-либо в моем вопросе, спасибо.

ответ

3

Вы хотите создать Struct, который представляет собой простой класс для представления структуры данных. Структура будет принимать свои аргументы в позиционно, что это именно то, что вы хотите, так как вы можете восклицательный знак массива в вызове метода (превратить массив в списке аргументов)

Так

Thing = Struct.new(:name, :membership, :spouse, :lap12) 

array = ['Larry', 'gold', 'Sue', 2.2] 
thing = Thing.new(*array) 

#note that the splat (*) is equivalent to saying 
# Thing.new(array[0], array[1], array[2], array[3]) 

thing.name # => "Larry" 
thing.lap12 # => 2.2 
+0

Спасибо, это работает точно так, как это необходимо. – rubyuser1357796

0

Определенно подход с struct является одним из лучших.

Также Вы могли бы сделать что-то подобное:

ЗДЕСЬ БЫТЬ Драконов, НЕ ПОПРОБОВАТЬ НА ДОМУ! :)

class Foo 

    def lots_of_vars(array) 
    name = array[0] 
    email = array[1] 
    description = array[2] 

    binding 
    end 

    def bar 
    array = ['Luke', '[email protected]', 'Lorem ipsum'] 
    eval('"My name is #{name}, email: #{email}, here is description: #{description}"', lots_of_vars(array)) 
    end 

end 

foo = Foo.new 
foo.bar 

Для получения более подробной информации вы можете проверить это хороший блог о рубине bindinghttp://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc

+0

Спасибо за ресурсы. Очень полезно. – rubyuser1357796

+0

никаких проблем, но, пожалуйста, пообещайте мне, что вы не будете использовать технику 'binding' в своем приложении;) – luacassus

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