Хорошо ли иметь локальные переменные, начинающиеся с подчеркивания?
Я просто попадаю в Ruby и прихожу из среды Java и C/C++.
при кодировании первого маленького проекта в Ruby я как-то привык, чтобы все локальные переменные начинались с подчеркивания. Я думаю, что моей главной мотивацией для этого была лучшая читаемость и отличие от вызовов методов.
а в принципе есть только три типа переменных ($global
, @instance
и local
), подавляющее большинство переменных начинаются с символа подчеркивания. Я не очень конечно, хорошо это или плохо. Кроме того, во многих других языках подчеркивание будет заменено другим символом.
тут как-то лучшие практики относительно именования переменных рядом с обычным CamelCase и/или подчеркнуть, разделенных? Какие привычки профессионального "рубистов"? Я пропустил некоторые общие соглашения Ruby, когда я выбрал ведущий подчеркивание?
редактировать
Спасибо всем ответам и предложениям. Это мне очень помогло.
краткий итог описания Answers and Comments below
(для кратковременного посетителя)
ведущие подчеркивания идут с:
- метод аргументы:
def my_method(_my_arg)
- аргументов блока: например,
my_array.each { |_x| puts _x}
все другие локальные переменные без ведущих подчеркивает, как программисты, например,JavaScript может запутаться о предполагаемом поведении переменных.
для визуального разделения между именами переменных и вызовов методов, заставляя себя использовать "(
" скобках ")
" С все вызовы методов могут значительно повысить читаемость.
4 ответов
ничего плохого в вашей идее. Но если бы у меня были проблемы с различением локальных vars от вызовов методов, я бы, вероятно, просто заставил себя всегда использовать ()
's на методы. (Моя команда на работе обсуждала, как сделать эту часть наших стандартов кодирования).
a = thing # var
b = thing() # method
возможным преимуществом этого является читаемость для других. Кто-то может задаться вопросом о вашем leading _, но используя ()
на всех вызовах метода должно быть ясно для всех.
существующие ответы на этот вопрос теперь несколько лет, и соглашения изменились. Вы должны использовать только начальное подчеркивание (_some_param
) или отдельное подчеркивание (_
), чтобы указать, что вас не волнует значение. The rubocop style linting tool будет карп о "бесполезном назначении", если вы назначаете переменную, но не используете ее, но она будет игнорировать переменные с ведущим подчеркиванием. Это позволяет вам четко указать, что вы не заботитесь о ценят и не намерены использовать.
вот несколько надуманный пример использования в контексте RSpec:
describe 'login' do
let(:user) { FactoryGirl.create(:user, login: 'bob') }
it 'must be unique' do
_user1 = user
user2 = User.new login: 'bob'
expect(user2.valid?).to be_false
end
end
здесь мы указываем, что наш user
помощник мемоизация имеет побочный эффект и возвращает что-то, но мы не заботимся об этом. Вы также можете просто пропустить задание полностью, но увидеть голый user
на строке сама по себе выглядит странно и не раскрывает намерения так ясно:
describe 'login' do
let(:user) { FactoryGirl.create(:user, login: 'bob') }
it 'must be unique' do
user
user2 = User.new login: 'bob'
expect(user2.valid?).to be_false
end
end
другие сценарии включают игнорирование значений в итераторы или переопределение метода, в котором вы хотите сохранить исходную подпись метода, но не заботитесь о некоторых значениях:
def greet(name, _title)
puts "Hi, #{name}!"
end
по моему опыту, переменные с префиксом подчеркивания в Ruby очень похожи на переменные с префиксом подчеркивания в JavaScript: флаг" не трогать". Более конкретно, они используются, когда разработчик делает что-то, что действительно не должно пониматься как часть объекта или не должно рассматриваться как концептуальный интерфейс объекта.
Это более ясно в мире JavaScript, где кто-то эмулирует "private", префиксируя переменную с помощью подчеркивать. Они кодируют, что есть часть объекта, которая находится под капотом и может быть проигнорирована при взгляде на объект снаружи.
в Ruby я действительно видел это только с такими вещами, как кэш или одноэлементный экземпляр - то, что должно быть невидимым для потребителей вашего объекта. Не подчеркнутые переменные-это вещи, которые могут быть интересны людям, использующим ваш объект.
в любом случае, они кажутся довольно редкими, и я бы избегайте их, если вы не хотите послать сигнал следующему парню, что происходит какая-то дополнительная магия или вуду.
что касается различения для вызовов методов, если вы беспокоитесь, что может быть путаница между методом и локальной переменной, я бы назвал метод на self
уточнить. Например:
def foo
...
end
def some_method
foo # method
bar # variable
end
Если это кажется неясным по какой-либо причине, вы можете уточнить с
def some_method
self.foo
bar
end
видя, как переменные экземпляра имеют @
знак перед ними, а глобальные переменные имеют $
знак перед ними уже в ruby, вероятно, нет необходимости ставить символ подчеркивания перед именами переменных. Тем не менее, я не думаю, что это плохая практика. Если это помогает вам читать или писать код в Ruby, вы должны использовать его.
Я иногда видел код Ruby, где аргумент для метода экземпляра в классе имеет подчеркивание перед ним. Например:
def my_method(_argument1)
# do something
end
и я думаю, что когда вы имеете дело с классом, который может иметь свои собственные атрибуты, например, файл модели в rails, это может быть полезно, чтобы вы знали, что имеете дело с переменной, которая была передана в метод, а не с одним из атрибутов, принадлежащих классу/модели.