Хорошо ли иметь локальные переменные, начинающиеся с подчеркивания?

Я просто попадаю в 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, это может быть полезно, чтобы вы знали, что имеете дело с переменной, которая была передана в метод, а не с одним из атрибутов, принадлежащих классу/модели.