rails - ruby friendly




Что такое двойная двоеточие Ruby `::`? (6)

Какая польза от сферы (закрытой, защищенной), если вы можете просто использовать :: для раскрытия чего-либо?

В Ruby все раскрывается, и все можно изменить из любого места.

Если вас беспокоит тот факт, что классы могут быть изменены извне «определения класса», тогда Ruby, вероятно, не для вас.

С другой стороны, если вы разочарованы тем, что классы Java блокируются, то Ruby, вероятно, вы ищете.

Что это за двоеточие :: ? Например, Foo::Bar .

Я нашел definition :

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

Какая польза от сферы (закрытой, защищенной), если вы можете просто использовать :: для раскрытия чего-либо?


Ruby on rails использует :: для разрешения пространства имен.

class User < ActiveRecord::Base

  VIDES_COUNT = 10
  Languages = { "English" => "en", "Spanish" => "es", "Mandarin Chinese" => "cn"}

end

Чтобы использовать его:

User::VIDEOS_COUNT
User::Languages
User::Languages.values_at("Spanish") => "en"

Кроме того, другое использование: при использовании вложенных маршрутов

OmniauthCallbacksController определяется пользователями.

и маршрут похож:

devise_for :users, controllers: {omniauth_callbacks: "users/omniauth_callbacks"}


class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

end

Добавляя к предыдущим ответам, для Ruby необходимо использовать :: для доступа к методам экземпляра. Все следующие действительны:

MyClass::new::instance_method
MyClass::new.instance_method
MyClass.new::instance_method
MyClass.new.instance_method

Согласно лучшим практикам, я считаю, что рекомендуется только последнее.


Нет, это не доступ к каждому методу, это оператор «разрешения», то есть вы используете его для разрешения области (или местоположения, которую вы можете сказать) постоянного / статического символа.

Например, в первой строке вашей строки Rails использует ее для поиска базового класса внутри ActiveRecord.Module, во втором он используется для поиска метода класса (статического) класса Routes и т. Д. И т. Д.

Он не используется, чтобы разоблачить что-либо, его использовали, чтобы «найти» вещи вокруг ваших областей.

http://en.wikipedia.org/wiki/Scope_resolution_operator


:: Позволяет вам получить доступ к константе, модулю или классу, определенным внутри другого класса или модуля. Он используется для предоставления пространств имен, так что имена методов и классов не конфликтуют с другими классами разными авторами.

Когда вы видите ActiveRecord::Base in Rails, это означает, что Rails имеет что-то вроде

module ActiveRecord
  class Base
  end
end

т.е. класс под названием Base внутри модуля ActiveRecord который затем называется ActiveRecord::Base (вы можете найти это в источнике Rails в activerecord-nnn / lib / active_record / base.rb)

Общим использованием :: является доступ к константам, определенным в модулях, например

module Math
  PI = 3.141 # ...
end

puts Math::PI

Оператор :: не позволяет обойти видимость методов, отмеченных как закрытыми, так и защищенными.


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

module SomeModule
    module InnerModule
        class MyClass
            CONSTANT = 4
        end
    end
end

Вы можете получить доступ к CONSTANT из-за пределов модуля как SomeModule::InnerModule::MyClass::CONSTANT .

Это не влияет на методы экземпляров, определенные в классе, поскольку вы обращаетесь к тем, у кого есть другой синтаксис (точка).

Соответствующее примечание. Если вы хотите вернуться в пространство имен верхнего уровня, сделайте следующее: :: SomeModule - Benjamin Oakes







operators