2017/11/6
Ruby - warning: toplevel constant B referenced by A::B
markdown
##問題
warning: toplevel constant B referenced by A::B
##成因
當 A 是一個 class 且 A::B 還沒有被定義時,ruby 找不到 A::B 時,若 B 有定義,就先使用 B, 而不是拋出 Module#const_missing。
```
class A
end
A::String
#warning: toplevel constant String referenced by A::String
```
但 rails 的 autoload 是透過修改 Module#const_missing 而完成的。也就是說,rails 還來不及 autoload 就已經被 toplevel constant 攔截了。
##解法一
在使用到 A::B 的檔案前面都加 require_dependency 'a/b'
##解法二
在使用到 B 的檔案後面加 require_dependency 'a/b' 確保 rails 不可能會有知道 B 的存在但不知道 A::B 的存在的可能發生。
參考文件
[http://stem.ps/rails/2015/01/25/ruby-gotcha-toplevel-constant-referenced-by.html](http://stem.ps/rails/2015/01/25/ruby-gotcha-toplevel-constant-referenced-by.html)
[https://stackoverflow.com/questions/18515100/warning-toplevel-constant-referenced](https://stackoverflow.com/questions/18515100/warning-toplevel-constant-referenced)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言