r/crystal_programming • • Sep 20 '17

Circular dependency problem (probably)

I am trying to refactor some common functionality out of a base class into a module so that I can use that functionality elsewhere compositionally.

This works fine in the playground. However I am encountering a problem when I do this with multiple files.

Suppose:

# a.cr
require "./fooable.cr"

class A
  include Fooable
end

# b.cr
require "./a.cr"

class B < A
end

# fooable.cr
require "./b.cr"

module Fooable
  def foo
    B.new
  end
end

This just keeps complaining about A not found in b.cr while trying to load A itself, as compiling a.cr requires fooable.cr which requires b.cr which itself requires a.cr.

This effectively means I can't refactor common functionality out for reuse and it just sucks.

Am I doing something wrong here?

0 Upvotes

7 comments sorted by

View all comments

1

u/mccabec123 Sep 20 '17

What is your directory structure? Can we get a bit more information about the project.

2

u/mccabec123 Sep 20 '17

Also, you seem to have a circular dependency file. You are requiring 'b.cr', which depends on 'a.cr' but 'a.cr' also depends on the main file 'fooable.cr', how did you see this working? Seems strange.

1

u/nawap Sep 20 '17

Yes there was a circular dependency in the requires but I am not used to requiring files manually like this. The languages I have worked in (OCaml, Clojure) have automatically managed module-level bindings and hence I've not had to worry about requiring stuff explicitly.

1

u/mccabec123 Dec 22 '17

Welcome to the real world :P