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"
в таблице строк. Ссылки разные, но контент один и тот же.
Если вы хотите просто передать значения массива в функцию, вы можете сделать это:
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