Ruby: передача одинаковых параметров нескольким методам внутри класса - PullRequest
1 голос
/ 11 октября 2019

Извините, если это слишком просто, чтобы спросить. Скажем, у меня есть 5 методов внутри одного класса. Когда я вызываю каждый метод, мне нужно передать одинаковые параметры. Есть ли способ упростить это и избежать повторения?

class Class1
        def method1(arg1, arg2, arg3)
                puts arg1, arg2, arg3
        end
        def method2(arg1, arg2, arg3)
                puts arg1, arg2, arg3
        end
        def method3(arg1, arg2, arg3)
                puts arg1, arg2, arg3
        end
        def method4(arg1, arg2, arg3)
                puts arg1, arg2, arg3
        end
        def method5(arg1, arg2, arg3)
                puts arg1, arg2, arg3
        end
end

obj1 = Class1.new

obj1.method1(1, 2, 3)
obj1.method2(4, 5, 6)
obj1.method3(7, 8, 9)
obj1.method4(10, 11, 12)
obj1.method5(13, 14, 15)

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 11 октября 2019

Использование конструктора может быть полезным:

class MyClass

  def initialize(arg1, arg2, arg3)
    @arg1, @arg2, @arg3 = arg1, arg2, arg3
  end

  def method_one
    puts @arg1, @arg2, @arg3
  end

  def method_two
    puts @arg1, @arg2, @arg3
  end

end

my_obj = MyClass.new(1,7,13)
my_obj.method_one  #=> 1 7 13 
my_obj.method_two  #=> 1 7 13

Вы также можете быть более краткими, используя Struct:

MyClass = Struct.new(:arg1, :arg2, :arg3) do

  def method_one
    puts arg1, arg2, arg3
  end

  def method_two
    puts arg1, arg2, arg3
  end

end

my_obj = MyClass.new(1,7,13)
my_obj.method_one  #=> 1 7 13 
my_obj.method_two  #=> 1 7 13
puts my_obj.arg2   #=> 7
1 голос
/ 11 октября 2019

РЕДАКТИРОВАТЬ : Я просто замечаю ответ pjs (я просмотрел начало и почему-то пропустил контент) ... пойди, проголосуй за него, он был здесь первым, и этото же решение.

Если вы не управляете классом (вы не можете использовать переменные экземпляра класса), рассмотрите возможность использования оператора splat (*).

т.е.:

class MyClass
    def mthd1(arg1,arg2,arg3)
      #...
    end
    def mthd2(arg1,arg2,arg3)
      #...
    end
    def mthd3(arg1,arg2,arg3)
      #...
    end
    def mthd4(arg1,arg2,arg3)
      #...
    end
end
foo = MyClass.new
args_to_pass = [1,2,3]
foo.mthd1(*args_to_pass)
foo.mthd2(*args_to_pass)
foo.mthd3(*args_to_pass)
foo.mthd4(*args_to_pass)

Или даже обезьяна исправит класс, чтобы добавить метод, который сделает это за вас (не проверено):

class MyClass
   # monkey patching
   MULTI_METHOD_NAMES = [:mthd1, :mthd2, :mthd3, :mthd4]
   def multi_func *args
       MULTI_METHOD_NAMES {|m| self.send(m, *args)
   end    
end
# use:
foo = MyClass.new
foo.multi_func(1, 2, 3)
1 голос
/ 11 октября 2019

Ваш пример не согласуется с вашим утверждением о том, что вам нужны те же аргументы, но я опережаю альтернативную реализацию вашего примера.

class Klass
  # slightly more descriptive output from the methods...
  def method1(a1, a2, a3)
    puts "in method1"
    puts "#{a1}, #{a2}, #{a3}"
  end

  def method2(a1, a2, a3)
    puts "in method2"
    puts "#{a1}, #{a2}, #{a3}"
  end

  def method3(a1, a2, a3)
    puts "in method3"
    puts "#{a1}, #{a2}, #{a3}"
  end
end

# store the method symbols and arguments in arrays...   
m = [:method1, :method2, :method3]
args = [1, 2, 3]

obj = Klass.new
# ...which allows us to iterate over them.
m.each do |method|
  obj.send(method, *args)
  args.map! { |x| x + 3 }  # update the args as in the given example
end

производит:

in method1
1, 2, 3
in method2
4, 5, 6
in method3
7, 8, 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...