คุณเรียกตัวดำเนินการ -> ใน Ruby ว่าอะไร


205
  1. สิ่งที่คุณเรียก->ผู้ประกอบการดังต่อไปนี้?

    ->(...) do
      ...
    end
    
  2. ตัวอย่างข้อมูลต่อไปนี้ไม่เทียบเท่าหรือไม่

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
    

70
มันน่ารำคาญที่คุณไม่สามารถ google "->" - เป็นคำถามที่ดีที่จะถาม!
Kevin

10
@ Kevin อย่างไรก็ตามคุณสามารถใช้กองมากเกินในตัวของยางยืดค้นหาเพื่อค้นหา:"->" title:"->" [ruby] is:questionกุญแจสำคัญคือการใช้เครื่องหมายคำพูด

8
Symbolhound ยังสามารถทำสิ่งนี้: symbolhound.com/?q=-%3E+ruby
Andrew Grimm

7
น่ารำคาญหรือไม่น่ารำคาญ แต่ googling สำหรับคำขอ "ruby ->" ให้ลิงก์ไปยังคำถามนี้เป็นผลลัพธ์อันดับแรก
fl-web

6
@ Kevin บางทีสิ่งที่มีการเปลี่ยนแปลงไปในอดีตที่ผ่านมา 2 ปี แต่ googling ruby "->"เป็นวิธีการที่ผมพบว่าโพสต์นี้ :)
Nippysaurus

คำตอบ:


238

ในทับทิม Programming Language ( "วิธีการ, Procs, Lambdas และปิด") ซึ่งเป็นแลมบ์ดากำหนดโดยใช้->เรียกว่าแลมบ์ดาอักษร

succ = ->(x){ x+1 }
succ.call(2)

รหัสเทียบเท่ากับรหัสต่อไปนี้

succ = lambda { |x| x + 1 }
succ.call(2)

อย่างไม่เป็นทางการผมเคยได้ยินมันถูกเรียกว่าแลมบ์ดา stabbyหรือstabby อักษร


127

=>== Hash Rocket

แยกคีย์ออกจากค่าในตัวอักษรแผนที่แฮช


->== Dash Rocket

ใช้เพื่อกำหนดตัวอักษรแลมบ์ดาใน Ruby 1.9.X (ไม่มี args) และ Ruby 2.X (with args) ตัวอย่างที่คุณให้ ( ->(x) { x * 2 }& lambda { |x| x * 2 }) นั้นเทียบเท่ากันจริง


10
FYI 2 สไตล์ไม่สามารถใช้แทนกันได้อย่างสมบูรณ์ถ้าคุณใช้do/ endเนื่องจากกฎที่มีความสำคัญกว่า สิ่งนี้พิมพ์แลมบ์ดาที่ตรวจสอบแล้ว: puts -> do 1 end. สิ่งนี้ผ่านบล็อกไปputsขโมยจากแลมบ์ดาและทำให้เกิดข้อโต้แย้งข้อผิดพลาด:puts lambda do 1 end
เคลวิน

1
นอกจากนี้แลมบ์ดาแล็บส์ของทับทิม 1.9.3 ก็อนุญาตให้มีการโต้แย้งได้เช่นกัน
เคลวิน

3
@Kelvin ที่จะเป็นเพราะทับทิมพยายามที่จะตีความputs lambda do 1 endเป็นมากกว่าputs(lambda) do 1 end puts(lambda do 1 end)อันที่จริงแล้วการทำงานในความเป็นจริง - ทับทิมเพียงพยายามส่งบล็อกไปยังputsวิธีการมากกว่าlambdaวิธีถ้าไม่มีวงเล็บ
PJSCopeland

1
@PJSCopeland ฉันไม่ได้บอกว่าคุณไม่สามารถทำให้พวกเขาทำแบบเดียวกันได้ ฉันกำลังบอกว่าพวกเขาไม่ใช่ไวยากรณ์ที่ใช้แทนกันได้ 100% นั่นคือคุณไม่สามารถแทนที่แบบดรอปดาวน์ได้ในทุกกรณี (เพราะบางครั้งคุณจำเป็นต้องใส่วงเล็บเสริมlambda)
เคลวิน

@rdurand คุณแก้ไขด้วยการสรุป "Stabby lambdas ไม่สามารถยอมรับข้อโต้แย้งใน Ruby 1.9" ได้หรือไม่? สิ่งนี้ไม่ถูกต้องอย่างน้อย 1.9.3 - อนุญาตเนื้อหา
เคลวิน


3

->(x) { ... }lambda { |x| ... }เป็นเช่นเดียวกับ มันสร้างแลมบ์ดา ดูเคอร์เนล # lambda แลมบ์ ดาเป็นประเภทของ proc หนึ่งที่ทำให้มั่นใจได้ว่าจำนวนพารามิเตอร์ที่ส่งผ่านไปนั้นถูกต้อง ดูเพิ่มเติมพร :: ใหม่และเคอร์เนล # proc

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