ทำไมถ้าข้อความไม่แนะนำขอบเขตใน ruby ​​1.9


คำตอบ:


9

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

ตัวอย่างแรก:แทนที่เมธอด

class Employee
  if String.method_defined?(:encode)
    def name
      ...
    end
  else
    def name
      ...
    end
  end
end

ในตัวอย่างนี้มีสองคำจำกัดความที่แตกต่างกันสำหรับnameวิธีการ หนึ่งที่จะใช้หากString.encodeวิธีการที่มีอยู่และหนึ่ง (การใช้งานที่ด้อยกว่า) ที่จะใช้หากวิธีการเข้ารหัสไม่อยู่ โดยพื้นฐานแล้วสิ่งนี้จะช่วยให้คุณใช้สตริงที่เข้ารหัสอย่างถูกต้องหากไลบรารีสนับสนุน

ตัวอย่างที่สอง:แทนที่การใช้งาน

if String.method_defined?(:encode)
  module Builder
    ...
  end
else
  class String
    ...
  end
end

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

เหตุผลที่สำคัญทั้งหมด

ดังนั้นสิ่งนี้จะซื้อคุณ หากifคำสั่งแนะนำขอบเขตใหม่เมธอดหรือคลาสใหม่จะมีอยู่และใช้ภายในขอบเขตของifคำสั่งเท่านั้น ข้อ จำกัด นั้นทำให้ยากมากที่จะสนับสนุนไลบรารีที่จะต้องมีการเปลี่ยนแปลงสำหรับ Ruby 2.0 ในขณะที่เราย้ายออกจาก 1.9 ในอนาคต

ด้วยทั้งตัวอย่างที่มีให้ในงานนำเสนอที่คุณเชื่อมโยงด้วยเหตุผลคือการรักษา codebase หนึ่งฐานสำหรับไลบรารีของคุณในขณะที่ยังสนับสนุน Ruby หลายเวอร์ชัน ฉันเชื่อว่ามันเกิดจากความเจ็บปวดจากการเปลี่ยนระหว่าง Ruby 1.8 และ Ruby 1.9 ในขณะที่ทีมงานทับทิมกำลังก้าวเข้าสู่ 2.0 อย่างต่อเนื่องคุณจะยังสามารถให้การสนับสนุนผู้ใช้ของคุณเมื่อมีการเปลี่ยนแปลงที่เข้ากันไม่ได้ ฉันเชื่อว่ามีบางอย่างระหว่าง 1.9.1 ถึง 1.9.2 จะมีมากขึ้นในอนาคต


1

ฉันไม่เชี่ยวชาญ แต่ถ้าคุณดูคำถามที่พบบ่อยของ Ruby ที่นี่: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php

ส่วนที่ 2.3 "ตัวแปรท้องถิ่นสามารถเข้าถึงได้เมื่อใด" แสดงพฤติกรรมปัจจุบัน

เมื่อต้องการแก้ไขปัญหาการกำหนดขอบเขตสิ่งหนึ่งใน "แฮ็ค" ที่คุณต้องทำคือ:

ขอแนะนำให้คุณใส่คำสั่งการกำหนดเช่น = nil ก่อนที่จะเข้าถึงตัวแปรโลคอลเพื่อไม่ให้รบกวนพฤติกรรมของตัวแปรโลคอล

ฉันเชื่อว่า 1.9 จะลบความจำเป็นในการทำเช่นนี้และนี่อาจเป็นหนึ่งในไดรเวอร์สำหรับพฤติกรรมใหม่

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