В чем разница между этими двумя утверждениями в сценарии Chef?
Я использую Chef для установки пакетов. Я получаю сообщение об ошибке
node.default["installed_pkgs"] << 'amanda'
Undefined node attribute or method `<<' on `node'. To set an attribute, use `<<=value' instead.
Если я изменю это на:
node.default["installed_pkgs"] = 'amanda'
кажется, работает, или, по крайней мере, это не ошибка. Я взял это у кого-то, кто ушел, так что я не уверен в его коде, так как я не очень хорошо знаю Chef или Ruby.
2 ответа
Ваша проблема исходит от нее: https://github.com/chef/chef/blob/d8172e646d9fbf43e57bca5e20d0ac352ba9a66a/lib/chef/node/attribute_collections.rb#L175
узел не знает о << и думает, что это атрибут.
использование
node.default["installed_pkgs"] = 'amanda'
Разница в рубине.
<<
это сокращение для добавления в конец массива. Если у вас есть массив и вы хотите добавить его в конец, вы должны использовать <<
,
=
это ванильное задание. Вы используете это для присвоения значения переменной или хешу, но вы должны быть уверены, что назначаемое вами значение подходит; если вы назначите скалярное значение, когда Ruby ожидает массив, то ваша программа выдаст ошибку.