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

Если вы хотите заменить каждый знак пунктуации пробелом:

s = """
Baking cake of straw-bana-choco will take longer than expcted
Please include as much of the following data that is available.< >< >- Cake Type:< >- Flavors:< >- Decoration Type:< >- Icing:< >-
"""

remove_punc = str.maketrans(dict.fromkeys(string.punctuation, ' '))
print(str.translate(s, remove_punc))

Out:

Baking cake of straw bana choco will take longer than expcted
Please include as much of the following data that is available         Cake Type      Flavors      Decoration Type      Icing     

И здесь очень хороший обзор других методов: Быстрая пунктуация удаление с пандами

25
задан Nathan Fritz 4 September 2008 в 03:21
поделиться

2 ответа

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

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

36
ответ дан 28 November 2019 в 20:54
поделиться

На самом деле автозавершение действительно работает на .. Опции завершения найдены путем вызова #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, это получило бы то же самое как [1 112]. Вместо этого IRB имеет 1 022 предложения. Я не уверен, куда они происходят из, но это - ясно универсальный список, который на самом деле не основан на контексте.

:: оператор (также) используется для получения констант модуля, в то время как . не. Вот почему HTTP соберется в завершении для [1 116], но не для [1 117]. Net.HTTP не корректно, но Net::HTTP.

12
ответ дан 28 November 2019 в 20:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: