ฉันจะออกเสียง“ =>” ตามที่ใช้ในแลมบ์ดานิพจน์ใน. Net ได้อย่างไร


160

ฉันไม่ค่อยพบโปรแกรมเมอร์คนอื่นเลย!

ความคิดของฉันเมื่อฉันเห็นโทเค็นครั้งแรกคือ "บอกเป็นนัยว่า" เพราะนั่นคือสิ่งที่มันจะอ่านได้ในหลักฐานทางคณิตศาสตร์ แต่นั่นไม่ชัดเจน

ดังนั้นฉันจะพูดหรืออ่าน "=>" อย่างไรใน: -

IEnumerable<Person> Adults = people.Where(p => p.Age > 16)

หรือมีวิธีพูดตกลงกันได้ไหม?


6
120 โหวตขึ้นโหวตค่อนข้างน่าทึ่งสำหรับคำถามปิด
datps

ฉันมักจะออกเสียงว่า "หมายถึง" เป็นตัวดำเนินการที่ดูคล้ายกันในเชิงตรรกะ
IllidanS4 ต้องการโมนิก้ากลับ

คำตอบ:


149

ฉันมักจะพูดว่า 'เช่นนั้น' เมื่ออ่านโอเปอเรเตอร์นั้น

ในตัวอย่างของคุณ p => p.Age> 16 อ่านเป็น "P เช่นนั้น p.Age มากกว่า 16"

ในความเป็นจริงฉันถามคำถามนี้มากในฟอรัมอย่างเป็นทางการของ linq และ Anders Hejlsberg ตอบกลับโดยบอกว่า

ฉันมักจะอ่าน => โอเปอเรเตอร์เป็น "กลายเป็น" หรือ "ที่" ตัวอย่างเช่น
Func f = x => x * 2;
Func test = c => c.City == "London";
อ่านว่า "x กลายเป็น x * 2" และ "c ซึ่ง c.City เท่ากับ London"

เท่าที่ 'ไปที่' - มันไม่สมเหตุสมผลสำหรับฉัน 'p' ไม่ไปไหน

ในกรณีที่อ่านรหัสให้ใครสักคนพูดทางโทรศัพท์ตราบใดที่พวกเขาเป็นโปรแกรมเมอร์ C # ฉันจะใช้คำว่า 'lambda' นั่นคือ "p lambda p dot age มากกว่า สิบหก."

ในความคิดเห็นที่ Steve Jessop พูดถึง 'maps to' ในกรณีที่มีการเปลี่ยนแปลง

x => x * 2;

จะอ่าน

x แม็พกับ x คูณ 2

ซึ่งดูเหมือนจะใกล้เคียงกับความตั้งใจจริงของรหัสมากกว่า 'เป็น' สำหรับกรณีนี้


1
นั่นถูกต้องเฉพาะเมื่อแลมบ์ดาถูกใช้เป็นตัวกรอง
Andru Luvisi

4
"ไป" คือการแสดงผลที่น่าอึดอัดใจน้อยของ "populates กรอบสแต็คของ"
ปีเตอร์ Wone

1
ฉันไม่ชอบ "x กลายเป็น x * 2"; x คืออินพุตและยังคงเหมือนเดิมตลอด อ่านอย่างนั้นฟังดูเหมือนการทำงานที่ได้รับมอบหมาย
Germán

@ Peter - ฮ่า ๆ จริงมาก =) @ Germán - ฉันมักจะเห็นด้วยแม้ว่าฉันไม่สามารถนึกถึงตัวอย่างที่ดีกว่าสำหรับการเปลี่ยนแปลงได้ อาจจะ 'เปลี่ยนเป็น'?
Erik Forbes

5
ฉันจะพูดว่า "maps to" ในกรณีนั้น มีความเสี่ยงเล็กน้อยจากคนที่คิดว่าคุณกำลังพูดถึงภาชนะบรรจุ แต่คุณสามารถล้างสิ่งนั้นได้โดยการอธิบายในครั้งแรกที่คุณพูดว่าสิ่งที่คุณหมายถึงคือ "ผู้ดำเนินการแลมบ์ดาคุณรู้เท่ากัน กว่า".
Steve Jessop

56

จากMSDN :

นิพจน์แลมบ์ดาทั้งหมดใช้ตัวดำเนินการแลมบ์ดา => ซึ่งอ่านได้ว่า "ไปที่"


7
intersting บางทีอาจจะน่าสนใจมากขึ้นก็คือว่ามันเป็นความจริงสำหรับรุ่น VS2010แต่คำแนะนำได้ถูกลบออกจากรุ่น VS2012
Blair Conrad

@BlairConrad - อาจเป็นจริงเมื่อคุณเขียนความคิดเห็นของคุณ แต่มันมีอยู่สำหรับเวอร์ชัน VS ปัจจุบันทั้งหมดในขณะนี้
cp.engr

ฉันไม่เห็นคำว่า "ไปที่" ในเอกสาร MSDN ที่ลิงก์ในคำตอบข้างต้น ฉันจำได้ว่าประมาณปี 2010 ที่ปรึกษาคนหนึ่งบอกฉันว่าฟังก์ชั่นแลมบ์ดาควรอ่านว่า "ไปที่" และนั่นคือวิธีที่ฉันอ่านมาตลอด อย่างไรก็ตามการสะดุดคำถามนี้การอ่านว่า "เช่นนั้น" ทำให้ฉันเข้าใจได้ง่ายขึ้น
matt.fc

18

อ่านรหัสทางโทรศัพท์

จาก Eric Lippert:

โดยส่วนตัวฉันจะบอกว่า c => c + 1 เป็น "เห็นจะได้เห็นบวกหนึ่ง" รูปแบบบางอย่างที่ฉันเคยได้ยิน:

สำหรับการฉายภาพ (ลูกค้า c) => c.Name: "ลูกค้าดูกลายเป็นเห็นชื่อจุด"

สำหรับภาคแสดง (ลูกค้า c) => c.Age> 21: "ลูกค้าเห็นว่าจุดอายุดังกล่าวมากกว่ายี่สิบเอ็ด"


"ไปที่" เป็นวลีที่ฉันได้ยินมากที่สุดเมื่อทำงานกับทีม LINQ
DamienG

15

ฉันมักจะเรียกมันว่า "โอเปอเรเตอร์วัง" :-)

"p wang อายุ p มากกว่า 16"


10
นั่นคือ Numberwang!
comichael

4
คุณต้องบอกฉันว่าที่ไหนบนโลกนี้ที่ใคร ๆ เรียกว่า "วัง" ฉันมีสมาชิกในทีมคนหนึ่งบอกฉันว่ามันเป็น "วัง" และที่เดียวบน teh internetz เราทุกคนสามารถพบได้ในคำตอบนี้
Kristopher

1
@Wartickler ฉันมาจากรัฐเวสเทิร์นออสเตรเลีย - มักจะเรียกมันว่าโอเปอเรเตอร์วัง :-)
Aidos

7

ฉันเคยเห็นคนพูดว่า "ลูกศร"


6
ฉันหวังว่ามันเป็นเรื่องตลก
Jacob Carpenter

ไม่ใช่ - ฉันเคยเห็นแบบเดียวกัน
Erik Forbes

1
ฉันคิดว่าคนที่พูดว่า "ลูกศร" หมายความว่า: ->
Dour High Arch

6
ฉันไม่เคยเห็นแบบนั้น ได้ยินอาจ แต่ไม่เห็น
ctacke

Arrow ดูเหมือนสมเหตุสมผลกับฉันเพราะมันหมายถึงการแสดงสัญลักษณ์ลูกศรจากแลมบ์ดาแคลคูลัส ฉันได้ยินประเภทวิชาการเรียกว่าลูกศรหรือลูกศรขวาฉันเคยเห็นรหัส Haskell บนสไลด์ยางพาราที่มีเครื่องหมาย -> ตัวดำเนินการเปลี่ยนเป็นสัญลักษณ์ลูกศร
Robert


5

แล้ว "maps to" ล่ะ? มันมีทั้งรวบรัดและแม่นยำกว่าในทางเทคนิค (กล่าวคือไม่มีคำแนะนำของการเปลี่ยนแปลงสถานะเช่นเดียวกับ "ไปที่" หรือ "กลายเป็น" ไม่มีการรวมกลุ่มของชุดฟังก์ชันที่มีลักษณะเหมือนกับ "เช่นนั้น" หรือ "ซึ่ง") ทางเลือกอื่น ๆ แม้ว่าจะมีมาตรฐานอยู่แล้วเนื่องจากหน้า MSDN ดูเหมือนจะบอกเป็นนัย ๆ บางทีคุณควรไปกับมัน (อย่างน้อยก็สำหรับรหัส C #)


3

"Maps to" คือการออกเสียงที่ฉันต้องการ ศาสตร์การพูดฟังก์ชั่น "แมป" อาร์กิวเมนต์ของค่าที่คืน (อาจเรียกฟังก์ชันนี้ว่า "การแม็พ") ดังนั้นฉันจึงใช้คำศัพท์นี้ในการเขียนโปรแกรมโดยเฉพาะอย่างยิ่งการทำงานของโปรแกรม (โดยเฉพาะแคลคูลัสแลมบ์ดา) อยู่ใกล้กับคณิตศาสตร์มาก นอกจากนี้ยังเป็นกลางมากกว่า "กลายเป็น", "ไปที่" ฯลฯ เนื่องจากไม่แนะนำให้เปลี่ยนสถานะตามที่กล่าวถึงบริบท


2

ฉันไม่ได้คิดมาก แต่ฉันแค่พูดว่า "เป็น" สั้นและกระชับและบอกเป็นนัยว่าตัวแปรถูกส่งผ่านไปยังนิพจน์ ฉันคิดว่ามันอาจจะสับสนกับตัวเลข 2 ("สอง") แต่ฉันมักจะออกเสียง "เป็น" เหมือน "ตา" มากขึ้นเมื่อพูด ไม่มีใคร (ใครรู้จัก lambdas อย่างน้อย) เคยบอกฉันว่าพวกเขาคิดว่ามันไม่ชัดเจน ...

// "Func f equals x to x times two"
Func f = x=> x * 2;

// "Func test equals c to c dot City equals London"
Func test = c => c.City == "London"

2

คำตอบสั้น ๆ ของฉัน: "c 'lambda-of' e" แม้ว่าฉันจะยึดมั่นกับ "'แลมบ์ดา' ฟังก์ชั่น 'e" แต่ฉันคิดว่าแลมบ์ดาเอ้นั้นเป็นการประนีประนอมทั่วโลก การวิเคราะห์ดังนี้

นี่เป็นคำถามที่ดีถ้าคำตอบที่แปลกประหลาดเท่านั้น การแปลส่วนใหญ่มีความหมายอื่นนอกเหนือจากสำนวนแลมบ์ดาซึ่งนำไปสู่การตีความที่แปลกใหม่ ในฐานะที่เป็นแฮ็กเกอร์แลมบ์ดานิพจน์เก่าฉันแค่มองข้ามสัญกรณ์. NET และเขียนมันเป็นแลมบ์ดาในหัวของฉัน


สำหรับการบรรยายรหัสทางโทรศัพท์คุณต้องการให้ใครบางคนสามารถเขียนโค้ดตามลำดับ นั่นเป็นปัญหาแน่นอน แต่แลมบ์ดาลูกศรหรือบางสิ่งอาจจะดีที่สุดที่คุณจะได้รับหรืออาจเป็นแลมบ์ดาอิน แต่แลมบ์ดานั้นแม่นยำที่สุด

ปัญหาคือการใช้มัดและวิธีการตั้งชื่อสิ่งทั้งหมดและบทบาทของชิ้นส่วนด้านซ้ายและด้านขวาด้วยบางสิ่งที่ทำงานเมื่อพูดในที่ฝัง

นี่อาจเป็นปัญหาที่เกิดจากข้อ จำกัด !


ฉันจะไม่ใช้คำว่า "เช่นนั้น" เพราะนั่นก็หมายความว่าทางด้านขวาเป็นส่วนที่บอกว่าทางซ้ายมือควรจะพอใจ นั่นแตกต่างจากการพูดคุยเกี่ยวกับด้านขวาซึ่งด้านซ้ายได้รับการสรุปว่าเป็นพารามิเตอร์การทำงาน (คำสั่ง MSDN เกี่ยวกับ "การแสดงออกแลมบ์ดาทั้งหมด" นั้นน่ารังเกียจและไม่ถูกต้อง)

บางสิ่งบางอย่างเกี่ยวกับ "ไปที่" ถึงแม้ว่ามันอาจจะใกล้เคียงกับที่เราจะได้รับ "Goes to" หมายถึงการแปลง แต่ไม่มีตัวแปร c บางตัวที่ไปยังนิพจน์ใน c สิ่งที่เป็นนามธรรมของฟังก์ชันนั้นค่อนข้างเข้าใจยาก ฉันอาจคุ้นเคยกับสิ่งนี้ แต่ฉันยังคงปรารถนาสิ่งที่เน้นความเป็นนามธรรมของตัวแปร

เนื่องจากด้านซ้ายมือเป็นตัวระบุแบบง่ายเสมอในกรณีที่ใช้จนถึง [แต่รอส่วนขยายที่อาจทำให้เกิดความสับสนในภายหลังนี้] ฉันคิดว่า "c => นิพจน์" ฉันจะอ่าน "c 'แลมบ์ดา - ฟังก์ชั่นของนิพจน์ "" หรือแม้แต่ "c 'arg' 'function' expression" ในกรณีสุดท้ายฉันสามารถพูดสิ่งต่าง ๆ เช่น "b 'arg' c 'arg' 'expression' expression '

มันอาจเป็นการดีกว่าที่จะทำให้ชัดเจนยิ่งขึ้นว่าการแสดงออกแลมบ์ดาได้รับการแนะนำและพูดบางอย่างเช่น "'arg' b 'arg' c 'function' expression 'expression

การหาวิธีแปลทั้งหมดนี้เป็นภาษาอื่นเป็นแบบฝึกหัดสำหรับนักเรียน [; <)

ฉันยังคงกังวลเกี่ยวกับ "(b, c) => การแสดงออก" และตัวแปรอื่น ๆ ที่อาจเกิดขึ้นหากพวกเขายังไม่ได้ บางที "'args' b, c 'function' expression"


หลังจากทั้งหมดของ musing นี้ฉันสังเกตเห็นว่าฉันมาเพื่อแปล "c => e" เป็น "'lambda' c 'function' e" และสังเกตว่าการทำแผนที่ในรูปแบบที่แน่นอนจะต้องเข้าใจโดยบริบท: λc (e ), c => e, f โดยที่ f (c) = e, เป็นต้น

ฉันคาดหวังว่าคำอธิบาย "ไปสู่" จะมีชัยเหนือกว่าเพราะนี่คือที่ซึ่งคนส่วนใหญ่ที่โดดเด่นจะได้เห็นการแสดงออกแลมบ์ดาเป็นครั้งแรก ที่น่าเสียดาย. การประนีประนอมที่ดีอาจเป็น "c ' lambda-of ' e"


1
'' ฉันจะไม่ใช้คำว่า "เช่นนั้น" เพราะนั่นก็หมายความว่าทางด้านขวาเป็นเพรดิเคต '' - เมื่อมันถูกใช้เป็นเพรดิเคตแล้วนี่เป็นการแปลที่ถูกต้องเว้นแต่ฉันจะเข้าใจผิด
Erik Forbes

2

หากคุณจินตนาการถึงการแสดงออกแลมบ์ดาว่าเป็นวิธีที่ไม่ระบุตัวตนมันคือ "ไปที่" เหมาะสมพอสมควร

(n => n == String.Empty)

n "ไปที่" การแสดงออก n == String.Empty

มันไปที่วิธีการไม่ระบุชื่อดังนั้นคุณไม่จำเป็นต้องไปที่วิธีการในรหัส!

ขอโทษสำหรับสิ่งนั้น.

สุจริตฉันไม่ชอบที่จะใช้ "ไปที่" ในหัวของฉัน แต่ฉันเห็นคนอื่นบอกว่ามันดูแปลกและฉันคิดว่าฉันชัดเจนว่าขึ้น


2

นอกเหนือจากการรับขอบเขตก่อนหน้านี้ (ตัวแปรและค่าคงที่ทั้งหมดที่อยู่ในขอบเขตสำหรับบรรทัดปกติของรหัส ณ จุดที่นิพจน์แลมบ์ดาเกิดขึ้นพร้อมกับรหัสของนิพจน์) นิพจน์แลมบ์ดาคือ syntactic น้ำตาลสำหรับฟังก์ชันอินไลน์

รายการค่าทางด้านซ้ายของผู้ดำเนินการผลิต ("=>") มีส่วนช่วยในโครงสร้างและเนื้อหาของกรอบสแต็กที่ใช้ในการเรียกใช้ฟังก์ชันนี้ คุณสามารถพูดได้ว่ารายการค่าก่อให้เกิดทั้งการประกาศพารามิเตอร์และอาร์กิวเมนต์ที่ส่งผ่าน ในรหัสธรรมดาเหล่านี้กำหนดโครงสร้างและเนื้อหาของกรอบสแต็คที่ใช้ในการโทรไปยังฟังก์ชั่น

เป็นผลให้ค่า "ไปที่" รหัสการแสดงออก คุณควรจะพูดว่า "กำหนดกรอบสแต็กสำหรับ" หรือ "ไปที่" หรือไม่? :)

ในแอพพลิเคชั่นที่กำหนดไว้อย่าง จำกัด ของนิพจน์บูลีนที่ใช้เป็นเงื่อนไขตัวกรอง (การใช้แลมบ์ดาที่แสดงออกอย่างกว้างขวางโดยพิจารณาจากคำตอบอื่น ๆ สำหรับคำถามนี้) มันสมเหตุสมผลมากที่จะข้ามวิธีการนี้ ที่ "เป็นเพียงรวบรัดและพูดเพิ่มเติมเกี่ยวกับความหมายของรหัส

อย่างไรก็ตามการแสดงออกแลมบ์ดาไม่ใช่จังหวัดเดียวของ Linq และนอกบริบทนี้ควรใช้แบบฟอร์ม "ไปที่" ที่กว้างกว่า


แต่ทำไม "ไปที่"

เนื่องจาก "populate สแต็กเฟรมของรหัสต่อไปนี้" ยาวเกินไปที่จะพูดต่อไป ฉันคิดว่าคุณสามารถพูดว่า "is / is pass to to"

ความแตกต่างที่สำคัญระหว่างพารามิเตอร์ที่ส่งผ่านอย่างชัดเจนและตัวแปรที่บันทึกไว้ (ถ้าฉันจำได้อย่างถูกต้อง - แก้ไขฉันถ้าฉันผิด) คือการที่อดีตจะถูกส่งผ่านโดยการอ้างอิงและหลังโดยค่า


1
ฉันไม่เห็นว่าข้อสรุปของคุณเป็นอย่างไรจากการสนทนาของคุณ ในทางกลับกันฉันคิดว่า characterizing => ในแง่ของวิธีการปิดที่อาจนำไปปฏิบัติ (หรืออาจจะไม่) ไม่ได้เป็นวิธีที่ดีในการจับกับคำถามที่ถาม
orcmid

ย่อหน้าแรกทำให้เข้าใจผิด การแสดงออกของแลมบ์ดาเป็นโครงสร้างชั้นหนึ่ง ฟังก์ชั่นอินไลน์คือการเพิ่มประสิทธิภาพ ย่อหน้าสุดท้ายนั้นยิ่งกว่านั้นอีก ตัวแปรที่ถูกผูกไว้ในนิพจน์แลมบ์ดา (สิ่งที่คุณเรียกว่า "ตัวแปรที่ถูกจับ") จะไม่ผ่านที่ใดก็ได้ พวกมันบรรจุอยู่ในกล่องและเพิ่มเป็นส่วนหนึ่งของวัตถุแลมบ์ดา หากพวกเขาผ่านคุณจะต้องตั้งชื่อพวกเขาอีกครั้งเพื่อพูดถึงความแตกต่าง
Neowizard

1

ส่วนหนึ่งของปัญหาคือคุณสามารถอ่านออกเสียงที่แตกต่างกันออกไปขึ้นอยู่กับโครงสร้างของมัน มันเป็นความอัปยศที่มันไม่ได้สวยหรือรวมเป็นทับทิมของ


คุณพูดอย่างไร | เหมือนกับท่อหรือไม่
dtc

ยากที่จะหาคำแนะนำใด ๆ เกี่ยวกับสิ่งนี้ แต่ _why ใช้ "นำแต่ละ" เช่น People.each {| person | ทำให้ person.name} กลายเป็น "With People นำแต่ละบุคคลและพิมพ์ชื่อ"
Adam Lassek

1

ใน Ruby sybmol เดียวกันนี้เรียกว่า "hashrocket" และฉันได้ยินว่าโปรแกรมเมอร์ C # ก็ใช้คำนั้นด้วย (แม้ว่าการทำเช่นนั้นจะผิด)


0

สองเซ็นต์ของฉัน:

s => s.Age > 12 && s.Age < 20

"แลมบ์ดานิพจน์ที่มีพารามิเตอร์ s คือ { return s.Age > 12 && s.Age < 20;}"

ฉันชอบสิ่งนี้เพราะมันทำให้ฉันนึกถึงว่าการแสดงออกของแลมบ้ามาจากไหน

delegate(Student s) { return s.Age > 12 && s.Age < 20; };

=> เป็นเพียงช็อตคัตดังนั้นคุณไม่จำเป็นต้องใช้คำสำคัญผู้มอบหมายและรวมถึงข้อมูลประเภทเนื่องจากคอมไพเลอร์สามารถอนุมานได้


0

คำศัพท์ของฉันสำหรับ => ตามที่ใช้กับตัวอย่างที่แสดงผลลัพธ์

'result = s => s.Age > 12 && s.Age < 20'

s โดยที่ s.Age มากกว่า 12 และ s.Age น้อยกว่า 20

'result = x => x * 2'

x โดยที่ x ถูกคูณด้วย 2

'result = c => c.City == "London"'

c โดยที่ c.city เทียบเท่ากับ "London"

'result = n => n == String.Empty'

n โดยที่ n คือสตริงว่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.