На самом деле самый эффективный путь таким образом:
function is_assoc($array){
$keys = array_keys($array);
return $keys !== array_keys($keys);
}
Это работает, потому что это сравнивает ключи (которые для последовательного массива всегда являются 0,1,2 и т.д.) к ключам ключей (который, будет всегда быть 0,1,2 и т.д.).
Понятно!
Я создаю класс привязок
class BindMe
def initialize(key,val)
@key=key
@val=val
end
def get_binding
return binding()
end
end
и передаю экземпляр в ERB
dataHash.keys.each do |current|
key = current.to_s
val = dataHash[key]
# here, I pass the bindings instance to ERB
bindMe = BindMe.new(key,val)
result = template.result(bindMe.get_binding)
# unnecessary code goes here
end
Файл шаблона .erb выглядит следующим образом:
Key: <%= @key %>
Я не могу дать вам точного ответа, почему это происходит, потому что я не уверен на 100%, как работает ERB, но просто смотрю на ERB RDocs , в нем говорится, что вам нужна привязка
, которая является «объектом привязки или Proc, который используется для установки контекста оценки кода».
Попробовать приведенный выше код еще раз и просто заменить
result = template.result
на
result = template.result(binding)
заставил это работать.
Я уверен / надеюсь, что кто-то вмешается и предоставит более подробное объяснение того, что происходит. Ура.
РЕДАКТИРОВАТЬ: Для получения дополнительной информации о Привязке
и для того, чтобы сделать все это немного понятнее (по крайней мере, для меня), ознакомьтесь с Binding RDoc .
РЕДАКТИРОВАТЬ : Это грязный обходной путь. Пожалуйста, посмотрите мой другой ответ.
Это совершенно странно, но добавление
current = ""
перед циклом «for-each» решает проблему.
Да благословит Бог языки сценариев и их «языковые особенности» ...