дать массив функции, восклицательный знак?

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Убедитесь, что вы понимаете, почему. Это потому, что сравнение == сравнивает только ссылки; equals() метод сопоставляет содержимое по символу.

Когда вы вызываете new для a и b, каждый получает новую ссылку, указывающую на "foo" в таблице строк. Ссылки разные, но контент один и тот же.

0
задан Antoine Morrier 17 January 2019 в 10:40
поделиться

1 ответ

Если вы хотите просто передать значения массива в функцию, вы можете сделать это:

test_arr() {
  for i in "$@"; do
    echo $i
    printf '\n'
  done
:
}

arr=("lol 1" "lol 2" "lol 3")
test_arr "${arr[@]}"

"${arr[@]}" передаст все значения, правильно разграниченные функции, где мы можем получить к ним доступ через [ 113] (все аргументы).

!, о котором вы спрашивали, используется для косвенной ссылки. То есть "${!1}" - это не значение первого аргумента, а значение переменной, имя которой равно значению первого аргумента.


Я мог бы что-то пропустить, но, похоже, желание объединить косвенное обращение и получить доступ ко всем элементам массива с косвенными ссылками в одно и то же время потребовало бы слишком много от оболочки, так что я вызвал могучего eval (хорошая причина, чтобы начать быть осторожным), чтобы помочь нам немного. Я взломал это, что позволяет вам передавать имя массива в функцию, а затем получать доступ к его элементам на основе этого имени, как видно в первом аргументе функции, но это не красиво, и одного этого должно быть достаточно, чтобы разочаровывать Это. В качестве примера он создает локальную переменную / массив, предполагая, что для этого была какая-то причина.

test_arr() {
  local a
  eval a=(\"\$\{$1\[@\]\}\")
  for i in "${a[@]}"; do
          echo $i
  done
}

arr=("lol 1" "lol 2" "lol 3")
test_arr arr
0
ответ дан Ondrej K. 17 January 2019 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: