ฉันไม่คิดว่าจะมีใครตอบคำถามได้ เขาไม่ได้ถามว่าเขาสามารถสะท้อนสตริงตามลำดับได้หรือไม่ ผู้เขียนคำถามต้องการทราบว่าเขาสามารถจำลองพฤติกรรมของตัวชี้ฟังก์ชันได้หรือไม่
มีคำตอบสองสามคำที่เหมือนกับสิ่งที่ฉันทำและฉันต้องการขยายความด้วยอีกตัวอย่างหนึ่ง
จากผู้เขียน:
function x() {
echo "Hello world"
}
function around() {
echo "before"
($1) <------ Only change
echo "after"
}
around x
เพื่อขยายสิ่งนี้เราจะมีฟังก์ชัน x echo "Hello world: $ 1" เพื่อแสดงเมื่อการเรียกใช้ฟังก์ชันเกิดขึ้นจริงๆ เราจะส่งสตริงที่เป็นชื่อของฟังก์ชัน "x":
function x() {
echo "Hello world:$1"
}
function around() {
echo "before"
($1 HERE) <------ Only change
echo "after"
}
around x
เพื่ออธิบายสิ่งนี้สตริง "x" จะถูกส่งไปยังฟังก์ชันรอบ ๆ () ซึ่ง echos "before" เรียกฟังก์ชัน x (ผ่านตัวแปร $ 1 พารามิเตอร์แรกที่ส่งผ่านไปยังรอบ ๆ ) ผ่านอาร์กิวเมนต์ "HERE" ในที่สุด echos หลังจาก .
นอกเหนือจากนี้เป็นวิธีการใช้ตัวแปรเป็นชื่อฟังก์ชัน ตัวแปรถือสตริงที่เป็นชื่อของฟังก์ชันและ (ตัวแปร $ arg1 arg2 ... ) เรียกใช้ฟังก์ชันที่ส่งผ่านอาร์กิวเมนต์ ดูด้านล่าง:
function x(){
echo $3 $1 $2 <== just rearrange the order of passed params
}
Z="x"
($Z 10 20 30)
ให้: 30 10 20 โดยที่เราเรียกใช้ฟังก์ชันชื่อ "x" ที่เก็บไว้ในตัวแปร Z และส่งผ่านพารามิเตอร์ 10 20 และ 30
ด้านบนที่เราอ้างอิงฟังก์ชันโดยการกำหนดชื่อตัวแปรให้กับฟังก์ชันเพื่อให้เราสามารถใช้ตัวแปรแทนการรู้ชื่อฟังก์ชันได้จริง (ซึ่งคล้ายกับสิ่งที่คุณอาจทำในสถานการณ์ตัวชี้ฟังก์ชันคลาสสิกใน c สำหรับการกำหนดผังโปรแกรม แต่ก่อน - การเลือกการเรียกใช้ฟังก์ชันที่คุณจะทำตามอาร์กิวเมนต์บรรทัดคำสั่ง)
ใน bash สิ่งเหล่านี้ไม่ใช่ตัวชี้ฟังก์ชัน แต่เป็นตัวแปรที่อ้างถึงชื่อของฟังก์ชันที่คุณใช้ในภายหลัง