|
211 | 211 | точек с запятыми. Пробелы (по большей части) игнорируются
|
212 | 212 | интерпретатором Руби, но их правильное использование является ключом
|
213 | 213 | к написанию легко читаемого кода.
|
214 |
| - <sup>[[ссылка](#spaces-operators)]</sup> |
| 214 | + <sup>[[ссылка](#spaces-operators)]</sup> |
215 | 215 |
|
216 | 216 | ```Ruby
|
217 | 217 | sum = 1 + 2
|
218 | 218 | a, b = 1, 2
|
219 | 219 | class FooError < StandardError; end
|
220 | 220 | ```
|
221 | 221 |
|
222 |
| - Единственным исключением для операторов является оператор возведения в степень: |
| 222 | + Из этого правила есть несколько исключений. Одним из них является оператор возведения в степень: |
223 | 223 |
|
224 | 224 | ```Ruby
|
225 | 225 | # плохо
|
|
229 | 229 | e = M * c**2
|
230 | 230 | ```
|
231 | 231 |
|
| 232 | + Другим ислючением является косая черта в литералах дробей: |
| 233 | + |
| 234 | + ```ruby |
| 235 | + # плохо |
| 236 | + o_scale = 1 / 48r |
| 237 | + |
| 238 | + # хорошо |
| 239 | + o_scale = 1/48r |
| 240 | + ``` |
| 241 | + |
232 | 242 | * <a name="spaces-braces"></a>
|
233 | 243 | Не используйте пробел после `(`, `[` или перед `]`, `)`. Вставляйте
|
234 | 244 | пробелы вокруг `{` и перед `}`.
|
|
775 | 785 | temperance = Person.new('Temperance', 30)
|
776 | 786 | ```
|
777 | 787 |
|
778 |
| - Скобки можно опустить только в следующих случаях: |
| 788 | + Всегда опускайте скобки в случаях, |
779 | 789 |
|
780 | 790 | * когда метод вызывается без аргументов:
|
781 | 791 |
|
|
813 | 823 |
|
814 | 824 | # некоторый код
|
815 | 825 | end
|
| 826 | + ``` |
816 | 827 |
|
817 |
| - # плохо |
818 |
| - puts(temperance.age) |
| 828 | + Скобки можно опускать, |
| 829 | + |
| 830 | + * когда методы имеют в Руби статус ключевого слова, но не являются декларативными: |
| 831 | + |
| 832 | + ```Ruby |
819 | 833 | # хорошо
|
| 834 | + puts(temperance.age) |
| 835 | + system('ls') |
| 836 | + # тоже хорошо |
820 | 837 | puts temperance.age
|
| 838 | + system 'ls' |
821 | 839 | ```
|
822 | 840 |
|
823 | 841 | * <a name="optional-arguments"></a>
|
|
1821 | 1839 | * <a name="named-format-tokens"></a>
|
1822 | 1840 | Используйте формат `%<name>s` вместо `%{name}` для поименованных
|
1823 | 1841 | переменных в шаблонах, это даст информацию о типе используемого значения.
|
1824 |
| - <sup>[[link](#named-format-tokens)</sup> |
| 1842 | + <sup>[[ссылка](#named-format-tokens)</sup> |
1825 | 1843 |
|
1826 | 1844 | ```Ruby
|
1827 | 1845 | # плохо
|
|
2600 | 2618 | end
|
2601 | 2619 | ```
|
2602 | 2620 |
|
2603 |
| -* <a name="modules-vs-classes"></a> Если класс определяет только методы класса, |
2604 |
| - то трансформируйте такой класс в модуль. Использовать классы логично в тех |
2605 |
| - ситуациях, когда нужно создавать экземпляры класса. |
| 2621 | +* <a name="namespace-definition"></a> |
| 2622 | + Определяейте (и открывайте заново) классы и модули, определенные в некотором |
| 2623 | + пространстве имен, с помощью явного вложения. Оператор разрешения пространства |
| 2624 | + (scope resolution) может создать трудные для понимания ситуации из-за |
| 2625 | + [лексического определения пространств имен](https://cirw.in/blog/constant-lookup.html) |
| 2626 | + в Руби. Пространство имен зависит для модуля от места его определения. |
| 2627 | + <sup>[[ссылка](#namespace-definition)]</sup> |
| 2628 | + |
| 2629 | + ```Ruby |
| 2630 | + module Utilities |
| 2631 | + class Queue |
| 2632 | + end |
| 2633 | + end |
| 2634 | + |
| 2635 | + # плохо |
| 2636 | + class Utilities::Store |
| 2637 | + Module.nesting # => [Utilities::Store] |
| 2638 | + |
| 2639 | + def initialize |
| 2640 | + # Refers to the top level ::Queue class because Utilities isn't in the |
| 2641 | + # current nesting chain. |
| 2642 | + @queue = Queue.new |
| 2643 | + end |
| 2644 | + end |
| 2645 | + |
| 2646 | + # хорошо |
| 2647 | + module Utilities |
| 2648 | + class WaitingList |
| 2649 | + Module.nesting # => [Utilities::WaitingList, Utilities] |
| 2650 | + |
| 2651 | + def initialize |
| 2652 | + @queue = Queue.new # Refers to Utilities::Queue |
| 2653 | + end |
| 2654 | + end |
| 2655 | + end |
| 2656 | + ``` |
| 2657 | + |
| 2658 | +* <a name="modules-vs-classes"></a> |
| 2659 | + Если класс определяет только методы класса, то трансформируйте такой класс |
| 2660 | + в модуль. Использовать классы логично в тех ситуациях, когда нужно создавать |
| 2661 | + экземпляры класса. |
2606 | 2662 | <sup>[[ссылка](#modules-vs-classes)]</sup>
|
2607 | 2663 |
|
2608 | 2664 | ```Ruby
|
|
3615 | 3671 | ```Ruby
|
3616 | 3672 | # плохо
|
3617 | 3673 | name = "Bozhidar"
|
| 3674 | + name = 'De\'Andre' |
3618 | 3675 |
|
3619 | 3676 | # хорошо
|
3620 | 3677 | name = 'Bozhidar'
|
| 3678 | + name = "De'Andre" |
3621 | 3679 | ```
|
3622 | 3680 |
|
3623 | 3681 | * **Стиль B:** Используйте двойные кавычки в ваших строчных литералах, если они не
|
|
3626 | 3684 | ```Ruby
|
3627 | 3685 | # плохо
|
3628 | 3686 | name = 'Bozhidar'
|
| 3687 | + sarcasm = "I \"like\" it." |
3629 | 3688 |
|
3630 | 3689 | # хорошо
|
3631 | 3690 | name = "Bozhidar"
|
| 3691 | + sarcasm = 'I "like" it.' |
3632 | 3692 | ```
|
3633 | 3693 |
|
3634 | 3694 | Второй стиль, по некоторым мнениям, более распространен среди разработчиков на
|
|
3759 | 3819 |
|
3760 | 3820 | ```Ruby
|
3761 | 3821 | # плохо (используется `String#strip_margin` из Powerpack)
|
3762 |
| - code = <<-END.strip_margin('|') |
| 3822 | + code = <<-RUBY.strip_margin('|') |
3763 | 3823 | |def test
|
3764 | 3824 | | some_method
|
3765 | 3825 | | other_method
|
3766 | 3826 | |end
|
3767 |
| - END |
| 3827 | + RUBY |
3768 | 3828 |
|
3769 | 3829 | # все еще плохо
|
3770 |
| - code = <<-END |
| 3830 | + code = <<-RUBY |
3771 | 3831 | def test
|
3772 | 3832 | some_method
|
3773 | 3833 | other_method
|
3774 | 3834 | end
|
3775 |
| - END |
| 3835 | + RUBY |
3776 | 3836 |
|
3777 | 3837 | # хорошо
|
3778 |
| - code = <<~END |
| 3838 | + code = <<~RUBY |
3779 | 3839 | def test
|
3780 | 3840 | some_method
|
3781 | 3841 | other_method
|
3782 | 3842 | end
|
| 3843 | + RUBY |
| 3844 | + ``` |
| 3845 | + |
| 3846 | +* <a name="heredoc-delimiters"></a> |
| 3847 | + Используйте говорящие разделители для HEREDOC. Разделители дают ценную |
| 3848 | + информацию о содержании документа. В качестве бонуса вы можете |
| 3849 | + получить подсветку кода внутри документа HEREDOC в некоторых редакторах, |
| 3850 | + если разделители заданы корректно. |
| 3851 | + <sup>[[ссылка](#heredoc-delimiters)]</sup> |
| 3852 | + |
| 3853 | + ```ruby |
| 3854 | + # плохо |
| 3855 | + code = <<~END |
| 3856 | + def foo |
| 3857 | + bar |
| 3858 | + end |
3783 | 3859 | END
|
| 3860 | + |
| 3861 | + # хорошо |
| 3862 | + code = <<~RUBY |
| 3863 | + def foo |
| 3864 | + bar |
| 3865 | + end |
| 3866 | + RUBY |
| 3867 | + |
| 3868 | + # хорошо |
| 3869 | + code = <<~SUMMARY |
| 3870 | + An imposing black structure provides a connection between the past and |
| 3871 | + the future in this enigmatic adaptation of a short story by revered |
| 3872 | + sci-fi author Arthur C. Clarke. |
| 3873 | + SUMMARY |
3784 | 3874 | ```
|
3785 | 3875 |
|
3786 | 3876 | ## Даты и время
|
|
4098 | 4188 |
|
4099 | 4189 | ```Ruby
|
4100 | 4190 | # плохо
|
4101 |
| - def method_missing?(meth, *params, &block) |
| 4191 | + def method_missing(meth, *params, &block) |
4102 | 4192 | if /^find_by_(?<prop>.*)/ =~ meth
|
4103 | 4193 | # много кода, чтобы сделать аналог find_by
|
4104 | 4194 | else
|
|
4107 | 4197 | end
|
4108 | 4198 |
|
4109 | 4199 | # хорошо
|
4110 |
| - def method_missing?(meth, *params, &block) |
| 4200 | + def method_missing(meth, *params, &block) |
4111 | 4201 | if /^find_by_(?<prop>.*)/ =~ meth
|
4112 | 4202 | find_by(prop, *params, &block)
|
4113 | 4203 | else
|
|
0 commit comments