Есть ли разница между ::и .при вызове методов класса в Ruby?

StackOverflow https://stackoverflow.com/questions/43134

  •  09-06-2019
  •  | 
  •  

Вопрос

Простой вопрос, но мне стало любопытно about...is есть функциональная разница между следующими двумя командами?

String::class
String.class

Они оба делают то, чего я ожидаю, то есть возвращаются Class -- но в чем разница между использованием :: и тот .?

Я замечаю, что в тех классах, у которых определены константы, автозаполнение IRB вернет константы в качестве доступных параметров, когда вы нажмете tab после :: но не после ., но я не знаю, в чем причина этого...

Это было полезно?

Решение

Тот Самый . оператор в основном говорит: "отправьте это сообщение объекту".В вашем примере это вызов этого конкретного участника.Тот Самый :: operator "детализирует" область, определенную слева от operator, а затем вызывает элемент, определенный справа от operator.

Когда вы используете :: вы должны ссылаться на определенные элементы.При использовании . вы просто отправляете сообщение объекту.Поскольку это сообщение может быть любым, автоматическое завершение не работает для . в то время как это делает для ::.

Другие советы

На самом деле, автоматическое завершение действительно работает для ..Варианты завершения можно найти, позвонив по телефону #methods на объекте.Вы можете убедиться в этом сами, переопределив Object.methods:

>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo  Object.bar
>> Object.

Обратите внимание, что это работает только тогда, когда выражение слева от . является буквальным.В противном случае получение объекта для вызова #methods включение потребовало бы оценки левой стороны, что могло бы иметь побочные эффекты.Вы тоже можете убедиться в этом сами:

[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)

Мы добавляем метод #baz Для Object который возвращает Object сам по себе.Затем мы выполняем автозаполнение, чтобы получить методы, которые мы можем вызвать Object.baz.Если IRB позвонит Object.baz.methods, это привело бы к тому же , что и Object.methods.Вместо этого у IRB есть 1022 предложения.Я не уверен, откуда они взялись, но это явно общий список, который на самом деле не основан на контексте.

Тот Самый :: оператор (также) используется для получения констант модуля, в то время как . это не так.Вот почему HTTP будет отображаться в завершении для Net::, но не для Net.. Net.HTTP это неверно, но Net::HTTP есть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top