0Pricing
Ruby Academy · บทเรียน

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 demo

Proc จับบริบทโดยรอบไว้

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ทบทวนบล็อก
  2. Proc
  3. แลมบ์ดา
  4. โคลเชอร์และขอบเขต
← กลับไปที่ Ruby Academy