Создать объект внутреннего класса после выполнения конструктора внешнего класса в Ruby? - PullRequest
1 голос
/ 03 июля 2019

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

class A
    @x = nil
    @y = nil
    def initialize(x, y)
        @x = x
        @y = y
    end

    class B
        def func_b
            puts "x- #{@x} and y- #{@y} in class B"
        end
    end

    class C
        def func_c
            puts "x- #{@x} and y- #{@y} in class C"
        end
    end
end

Мне удалось создать объект для классов B и C, как

#1
b = A::B.new
#2
a = A
c = a::C.new

Но я хочу инициализировать A перед созданием объектов для B или C

Что-то вроде

a = A.new(4,5)
b = a::C.new

Но, похоже, это не работает. Как я должен сделать выше.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Вложенные модули и классы в Ruby - это в основном организационный выбор.Сравните это

class A; end
class B; end

и это

class A
  class B; end
end

Между ними есть только два различия

  1. Во втором примере вы должны написать A::Bдля доступа к B
  2. Во втором примере константы, к которым обращаются в B, будут просмотрены в A, прежде чем они будут найдены в верхнем уровне

Есливы на самом деле хотите, чтобы экземпляры этих классов были связаны, вам нужны отношения подкласса и суперкласса между ними, т.е.

class B < A; end

теперь экземпляры B могут обращаться к методам и переменным экземплярав A.Обратите внимание, что это не зависит от вложенности, вы можете определить это как

class A
  class B < A; end
end

, но опять-таки это только организационная разница.


На совершенно отдельной заметке это

class A
  @x = nil
  @y = nil
end

делает не делает то, что вы думаете, он делает.Это устанавливает переменные экземпляра для самого A, то есть обрабатывает A как экземпляр A.singleton_class.Если вы хотите значения по умолчанию для экземпляров из A, вы должны установить их в initialize:

class A
  def initialize
    @x = nil
    @y = nil
  end
end
0 голосов
/ 03 июля 2019
class A
    def initialize(x, y)
        @x = x
        @y = y
    end
end

class B < A
    def func_b
        puts "x- #{@x} and y- #{@y} in class B"
    end
end

class C < A
    def func_c
        puts "x- #{@x} and y- #{@y} in class C"
    end
end

c = C.new(4,5)
c.func_c

печать

x- 4 and y- 5 in class C

Кажется, это работает нормально :).

...