Nix: антиквариат к набору - PullRequest
0 голосов
/ 03 октября 2019

Есть ли хороший способ добавить в кавычки значение непосредственно для набора?

В Nix мы можем использовать антикатотацию для выбора атрибута на основе переменной:

let 
  x = { a = "V" ; };
  sel = "a";  
in 
  x."${sel}"

result> "V"

Но чтоесли вместо этого мы хотим выбрать набор x, основанный на антикатоте?

let 
  x = { a = "V" ; };
  sel = "x";  
in
  "${sel}".a

result> (paraphrased) error: Expected a set but received a string.

Никс жалуется, что он пытался получить атрибут a из набора, но ему не далиset (x), ему была дана строка ("x"). Я понимаю, что мы не хотели бы вообще приводить строку "x" к значению in-scope, x, но мне кажется странным, что Nix не будет в этом случае, когда мы рассматриваем его специально как набор,Но я отвлекся ...

В любом случае, я был бы признателен за демонстрацию простой схемы преодоления этой проблемы. Или, что еще лучше, конструкцию многоразового использования, такую ​​как (toSet sel).a, которая работает, как и ожидалось. Спасибо!

1 Ответ

1 голос
/ 03 октября 2019

Если я правильно понимаю, вы хотите использовать переменную, чтобы выбрать другую переменную из текущей области. Синтаксис, который вы используете, предназначен для интерполяции строк, которая всегда будет возвращать только строку. Насколько я знаю, Nix не предоставляет способ динамического доступа к области таким образом.

Я не ожидаю, что такая функция будет реализована, потому что такая конструкция кажется довольно хрупкой. Добавление его к языку усложнит рассуждение о языке, потому что будет трудно определить, используется ли переменная или действительно ли строковая интерполяция возвращает строку.

Вероятно, лучше всего все перечислитьВозможно, вы захотите указать sel в одном наборе атрибутов. Это позволит читателю понять смысл кода.

let
  selectables = {
    x = { a = "V"; };
    y = { a = "W"; };
  };
  selector = "x";
in
  selectables.${selector}.a   # the quotes weren't necessary
...