Как Вы делаете полиморфизм в Ruby?

Я почти уверен, что lookup("pipe") будет делать то, что вы хотите, при условии, что скрипт доступен на целевом хосте:

- set_fact:
    my_vars: '{{ lookup("pipe", "./my_script.py") | from_json }}'

(замена from_json на from_yaml ] или что угодно, чтобы привести текстовый вывод из скрипта в структуру данных Python, возможно , что ansible принудительно приведет его автоматически, но явное лучше, чем неявное)

Если вы хотите, чтобы скрипт находится на управляющем компьютере и , вам, скорее всего, придется сделать несколько прыжков с delegate_to: и некоторым hostvars ниндзялем, чтобы продвинуть set_fact: с управляющего хоста на все хосты playbook [ 1112]

14
задан FlySwat 26 September 2008 в 03:55
поделиться

7 ответов

редактирование: добавленный больше кода для Вашего обновленного вопроса

правовая оговорка: Я не использовал Ruby через год или так и не установил его на этой машине, таким образом, синтаксис мог бы быть совершенно неправильным. Но понятия корректны.

<час>

Тот же самый путь, с классами и переопределенными методами:

class Animal
    def MakeNoise
        return ""
    end
    def Sleep
        print self.class.name + " is sleeping.\n"
    end
end

class Dog < Animal
    def MakeNoise
        return "Woof!"
    end
end

class Cat < Animal
    def MakeNoise
        return "Meow!"
    end
end

animals = [Dog.new, Cat.new]
animals.each {|a|
    print a.MakeNoise + "\n"
    a.Sleep
}
15
ответ дан 1 December 2019 в 06:16
поделиться

Построение на предыдущем ответе, это, как Вы могли бы сделать это?

<час> 112-секундное сокращение после разъяснения:

class Animal
    def MakeNoise
        raise NotImplementedError # I don't remember the exact error class
    end
    def Sleep
        puts self.class.to_s + " is sleeping."
    end
end

class Dog < Animal
    def MakeNoise
        return "Woof!"
    end
end

class Cat < Animal
    def MakeNoise
        return "Meow!"
    end
end

animals = [Dog.new, Cat.new]
animals.each {|a|
    puts a.MakeNoise
    a.Sleep
}

(я оставлю это, как, но победы "self.class.name" ".to_s")

2
ответ дан 1 December 2019 в 06:16
поделиться

Все ответы до сих пор выглядят довольно хорошими мне. Я думал, что просто упомяну, что целая вещь наследования не совсем необходима. Исключая поведение "сна" на мгновение, мы можем достигнуть целого желаемого результата с помощью ввода утки и опустив потребность создать базовый класс Животных вообще. Поиск с помощью Google для "ввода утки" должен привести к любому количеству объяснений, таким образом, для здесь, позвольте нам просто сказать, "если это идет как утка и шарлатаны как утка..."

поведение "сна" могло быть обеспечено при помощи смесительного модуля, как Массив, Хеш и другой Ruby встроенные классы inclue Счетное. Я не предполагаю, что это обязательно лучше, просто другое и возможно более идиоматически Ruby способ сделать его.

module Animal
  def sleep
    puts self.class.name + " sleeps"
  end
end

class Dog
  include Animal
  def make_noise
    puts "Woof"
  end
end

class Cat
  include Animal
  def make_noise
    puts "Meow"
  end
end

Вы знаете остальных...

22
ответ дан 1 December 2019 в 06:16
поделиться

Используя идиоматический Ruby

class Animal
  def sleep
    puts "#{self.class} is sleeping"
  end
end

class Dog < Animal
  def make_noise
    "Woof!"
  end
end

class Cat < Animal
  def make_noise
    "Meow!"
  end
end

[Dog, Cat].each do |clazz|
  animal = clazz.new
  puts animal.make_noise
  animal.sleep
end
10
ответ дан 1 December 2019 в 06:16
поделиться

Принцип утиного ввода просто, что объект должен ответить на вызываемые методы. Таким образом, что-то как этот может добиться цели также:

module Sleeping
  def sleep; puts "#{self} sleeps"
end

dog = "Dog"
dog.extend Sleeping
class << dog
  def make_noise; puts "Woof!" end
end

class Cat
  include Sleeping
  def to_s; "Cat" end
  def make_noise; puts "Meow!" end
end

[dog, Cat.new].each do |a|
  a.sleep
  a.make_noise
end
1
ответ дан 1 December 2019 в 06:16
поделиться

Это - то, как я записал бы это:

class Animal
  def make_noise; '' end
  def sleep; puts "#{self.class.name} is sleeping." end
end

class Dog < Animal; def make_noise; 'Woof!' end end
class Cat < Animal; def make_noise; 'Meow!' end end

[Dog.new, Cat.new].each do |animal|
  puts animal.make_noise
  animal.sleep
end

Это не действительно отличающееся от других решений, но это - стиль, который я предпочел бы.

Это - 12 строк по сравнению с этой 41 строкой (на самом деле, можно сбрить 3 строки при помощи инициализатора набора) от исходного примера C#.Неплохо!

0
ответ дан 1 December 2019 в 06:16
поделиться

Небольшой вариант решения Manveru, который динамически создает различные типы объектов на основе массива типов классов. Ничего особенного, просто немного яснее.

Species = [Dog, Cat]

Species.each do |specie|
  animal = specie.new   # this will create a different specie on each call of new
  print animal.MakeNoise + "\n"
  animal.Sleep
end
1
ответ дан 1 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: