Когда у нас есть некоторые константы, определенные в классе в Ruby и Rails, можем ли мы гарантировать доступ к нему в другом классе? - PullRequest
0 голосов
/ 29 апреля 2020

Если у нас есть некоторые константы внутри определения класса:

class Animal < ActiveRecord::Base
  GROWTH_FACTOR = 2

  ...
end

верно ли, что иногда Animal::GROWTH_FACTOR доступен для использования другим классом или ERB, таким как

class Plant < ActiveRecord::Base
  GROWTH_FACTOR = Animal::GROWTH_FACTOR / 2.0

  ...
end

или

<%= Animal::GROWTH_FACTOR %>

но иногда нет? (так что это будет случайный сбой, в зависимости от того, будет ли сервер Rails повторно запускать определение класса Animal для этого конкретного HTTP-запроса?) Действительно ли гарантировано, что GROWTH_FACTOR будет использоваться только внутри собственного определения каждого класса? Что если мы хотим гарантировать, что он доступен, использовать ли он @@GROWTH_FACTOR внутри класса, а затем использовать Animal.GROWTH_FACTOR в любом месте кода?

1 Ответ

1 голос
/ 29 апреля 2020

В вашем примере, 'Animal' и 'Plant' являются глобальными константами. Пока эти объявления были оценены и пока они не были каким-то образом неопределенными, они оба доступны откуда угодно, включая любые константы, определенные внутри классов.

Если эти два класса определены в файлах с именами 'animal.rb' и 'plant.rb', вы можете быть уверены, что обе константы доступны, require используя эти файлы. Если одно зависит от другого, то порядок, в котором вы запрашиваете файлы, имеет значение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...