Я не специалист по Ruby, но я знаю, что, если они появляются в моем коде, мой профессор кричит на меня.Mikej уже коснулся основных вещей, особенно с использованием #each
вместо #length
и #times
.
. Если я когда-либо перебираю какую-то коллекцию, то единственный раз, когда я используючто-то отличное от #each
- это когда мне нужно использовать пользовательский итератор, и даже тогда вы все равно можете использовать #each
, но вам нужно будет иметь управляющий оператор внутри переданного блока, чтобы убедиться, что блок не выполняется наопределенные случаи.Даже если это становится слишком сложным, единственный другой метод пользовательской итерации, который я действительно использую, - это оператор for i in Range.new( begin, end, optional_exclusion )
.И это все еще может быть превращено в условное в блоке для #each
, но это иногда экономит мне код и делает более явным, что я намеренно не выполняю код для всех элементов коллекции, а также явно показываю, что я устанавливаюграницы затронутых элементов во время входа в цикл вместо жестко закодированных значений или только всей коллекции.
Mikej уже указал на ошибку области действия при вызовах arrayKey и arrayValueв остальной части заявления if, поэтому я не буду беспокоиться об этом.Он также уже отметил, что вам, вероятно, следует переместить строку кода text =""
вверх на две строки, чтобы выйти из области видимости блока кода ответа.
После этого меня беспокоит только некоторые проблемы, не связанные с самим кодом,но в сообществе Ruby практикуется более широкий стиль программирования.Так что эти предложения ни в коем случае не надо принимать.Это просто делает чтение кода Ruby в целом проще.
Итак, мое первое предложение - всякий раз, когда вы вызываете метод, которому вы передаете блок, если вы не можете подобрать правильный отступ, вызов объекта, вызов метода, объявление переменной блока,блок кода и блок, закрывающий все в одной строке, не используйте фигурные скобки.В таких ситуациях многострочных кодовых блоков используйте ключевые слова do и end .
Второе мое предложение - использовать правильные отступы, которые в языке Rubyдва пробела вместо нормальных четырех, встречающихся в стилях кодирования многих других языков.У вас были правильные отступы для хорошего куска вашего кода, а затем вы все испортили, и это заставило некоторые строки в будущем выглядеть так, как будто они находятся на уровне области видимости, а не на уровне.Теперь этот совет далеко не соответствует стандарту стиля кодирования, но мой общий трюк, чтобы убедиться, что я нахожусь на правильном уровне контекста, - просто добавить комментарий в конце строки сразу после использования ключевого слова end
и ввести имясфера его просто закрыта.Это спасло меня от ряда ошибок в области видимости, но я никогда не слышал, чтобы кто-то другой делал это, и это, возможно, может загромождать код этими случайными комментариями в конце строки, но этот метод хорошо мне помог.
Мое третье предложение - улучшить использование строк и символов. Я почти боюсь сказать это только потому, что мне все еще нужно улучшить мое понимание символов в Ruby, и я не припоминаю использование класса Yelp в каких-либо недавних сценариях, поэтому я ослеп на этом. Тем не менее, похоже, что вы используете строку 'businesses'
как ключ Hash. Общее правило в Ruby: если вы используете строку только для того, что она представляет, вам следует использовать символ, а если вы используете строку, потому что вам действительно нужно ее символьное содержимое, то вам, вероятно, следует придерживаться использования строки. Это просто потому, что каждый раз, когда вы вызываете строковый литерал, создается новая строка и сохраняется в системной памяти. Так что здесь, так как вы используете 'businesses'
внутри каждого блока, который находится внутри и каждого блока, вы потенциально выделяете эту строку O (n²) раз (хотя выделения для внутреннего блока будут собираться мусором во время следующей итерации. вместо этого использовался символ, такой как «: companies», он инициализирует его только один раз. Также в случае строки text =""
вы должны преобразовать ее в строковый литерал в одну кавычку. Интерпретатор Ruby может анализировать строковые литералы в одинарных кавычках быстрее, чем двойные кавычки, поэтому, как правило, если вы можете использовать строковый литерал в одинарных кавычках, сделайте это.
Все, что я получил за предложения. Возьмите их так, как они вам нужны или хотите. Также вот как будет выглядеть ваш код, если вы примете мои предложения, а я ничего не сломал в процессе.
def mineLocation
client = Yelp::Client.new
request = Yelp::Review::Request::GeoPoint.new(:latitude=>13.3125,
:longitude => -6.2468,
:yws_id => 'nicetry')
response = client.search(request)
text = ''
response[:businesses].each do |businessEntry|
response[:businesses][businessEntry].each do |key, value|
if value.kindOf( Array )
value.each do |arrayEntry|
text += "\"#{key}\":["
value[arrayEntry].each do |arrayKey, arrayValue|
text += "{\"#{arrayKey}\":\"#{arrayValue}\"},"
end #each
text += ']'
end #each
else
# Didn't fix because I didn't know you intentions here.
text += "\"#{arrayKey}\":\"#{arrayValue}\","
end #if
end #each
end #each
end #def
Я не заменил 'nicetry'
на символ только потому, что не знаю, как работает класс Yelp, и ему явно может понадобиться строка вместо символа. Я также не знал, каков был предполагаемый эффект кода, поскольку единственный раз, когда этот код выполняется, это когда переменные находятся вне области видимости, поэтому у меня не было никакого способа узнать, на что вы пытались ссылаться в этой строке. Тем более что в этот момент ваше значение также не является массивом.
Я знаю, что это длинный ответ, но я надеюсь, что это поможет!