Proc
ออบเจ็กต์บล็อกที่นำกลับมาใช้ใหม่ได้
Proc เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
ออบเจ็กต์บล็อกที่นำกลับมาใช้ซ้ำได้
บล็อกไม่ใช่ออบเจ็กต์ในตัวเอง ดังนั้นคุณจึงเก็บบล็อกไว้ในตัวแปรไม่ได้ Proc จะห่อบล็อกให้เป็นออบเจ็กต์จริงที่คุณบันทึก ส่งต่อ และเรียกใช้ภายหลังได้
greeter = Proc.new { puts "Hello!" }
greeter.call
greeter.callการสร้าง Proc
มีสองวิธีที่ใช้สร้าง Proc กันทั่วไป ได้แก่ Proc.new { ... } และเมธอดของ Kernel ที่เขียนสั้นกว่าว่า proc { ... } ทั้งสองวิธีสร้างออบเจ็กต์ประเภทเดียวกัน
double = proc { |x| x * 2 }
p double.call(5)การเรียกใช้ Proc
คุณสามารถเรียกใช้ Proc ได้หลายวิธี ได้แก่ .call, .() และรูปแบบย่อโดยใช้วงเล็บเหลี่ยม [ ] ทั้งหมดให้ผลเทียบเท่ากัน
square = proc { |x| x * x }
puts square.call(4)
puts square.(4)
puts square[4]Proc รับอาร์กิวเมนต์
Proc รับพารามิเตอร์ได้เช่นเดียวกับบล็อก โดยประกาศพารามิเตอร์ไว้ระหว่างเครื่องหมายไปป์
add = proc { |a, b| a + b }
puts add.call(3, 7)การเก็บ Proc ในอาร์เรย์
เนื่องจาก Proc เป็นออบเจ็กต์ คุณจึงเก็บชุดพฤติกรรมต่าง ๆ ไว้และเรียกใช้ทีละรายการได้
ops = [proc { |x| x + 1 }, proc { |x| x * 2 }]
result = 5
ops.each { |op| result = op.call(result) }
puts resultการส่ง Proc เป็นบล็อก
เติม & หน้า Proc เพื่อส่งให้เมธอดที่ต้องการบล็อก Ruby จะคลาย Proc กลับเป็นรูปแบบบล็อกให้
printer = proc { |n| puts "Item: #{n}" }
[1, 2, 3].each(&printer)การจับบล็อกไว้เป็น Proc
ในทางกลับกันก็ทำได้เช่นกัน: &block ในลายเซ็นของเมธอดจะจับบล็อกที่ได้รับไว้เป็น Proc ซึ่งคุณสามารถเก็บไว้ได้
def make_handler(&block)
block
end
h = make_handler { |msg| puts "Got: #{msg}" }
h.call("ping")Proc ไม่เคร่งครัดเรื่องจำนวนอาร์กิวเมนต์
ลักษณะสำคัญคือ Proc จะไม่แจ้งข้อผิดพลาดเมื่อจำนวนอาร์กิวเมนต์ไม่ถูกต้อง อาร์กิวเมนต์ที่ขาดหายไปจะกลายเป็น nil และอาร์กิวเมนต์ส่วนเกินจะถูกละเว้น
p1 = proc { |a, b| puts "a=#{a.inspect} b=#{b.inspect}" }
p1.call(1)
p1.call(1, 2, 3)Proc กับการคืนค่า
return ภายใน Proc จะส่งคืนค่าจากเมธอดที่ครอบอยู่ ไม่ใช่เพียงจาก Proc เท่านั้น เรื่องนี้อาจทำให้เกิดความประหลาดใจได้ จึงควรใช้อย่างระมัดระวัง
def demo
p = proc { return 10 }
p.call
20 # never reached
end
puts demoProc จับบริบทโดยรอบไว้
Proc จะจดจำตัวแปรในขอบเขตที่มันถูกสร้างขึ้น ทำให้ Proc เป็นคลอเชอร์ ซึ่งเราจะศึกษาเรื่องนี้เพิ่มเติมในภายหลัง
factor = 3
times_factor = proc { |n| n * factor }
puts times_factor.call(10)นำทุกอย่างมาประกอบกัน
Proc เปลี่ยนบล็อกให้เป็นออบเจ็กต์ชั้นหนึ่ง:
- สร้างด้วย
proc { }หรือProc.new - เรียกใช้ด้วย
.call,.()หรือ[ ] - ส่งให้เมธอดด้วย
& - ไม่เคร่งครัดเรื่องจำนวนอาร์กิวเมนต์ และใช้
returnระดับเมธอด
pipeline = [proc { |s| s.upcase }, proc { |s| s + "!" }]
text = "hello"
pipeline.each { |step| text = step.call(text) }
puts textตรวจความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับ Proc ของคุณ
ทบทวน
คุณได้เรียนรู้เรื่อง Proc ดังนี้:
- Proc คือบล็อกที่ถูกห่อไว้เป็นออบเจ็กต์
- สร้างด้วย
proc/Proc.newและเรียกใช้ด้วย.call - ส่งให้เมธอดด้วย
& - ยอมรับจำนวนอาร์กิวเมนต์ที่ไม่ตรงกัน และใช้
returnระดับเมธอด
shout = proc { |word| puts word.upcase }
shout.call("ruby")คำถามที่พบบ่อย
บทเรียน “Proc” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Proc” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Proc”
ออบเจ็กต์บล็อกที่นำกลับมาใช้ใหม่ได้ คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Proc” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม
ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ