หากข้อความไม่แนะนำขอบเขตใน Ruby 1.9 อะไรคือเหตุผลที่อยู่เบื้องหลังการเปลี่ยนแปลงนี้จาก ruby 1.8?
หากข้อความไม่แนะนำขอบเขตใน Ruby 1.9 อะไรคือเหตุผลที่อยู่เบื้องหลังการเปลี่ยนแปลงนี้จาก ruby 1.8?
คำตอบ:
เหตุผลสองประการที่ทำให้สิ่งนี้เกิดขึ้นใน 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 จะมีมากขึ้นในอนาคต
ฉันไม่เชี่ยวชาญ แต่ถ้าคุณดูคำถามที่พบบ่อยของ Ruby ที่นี่: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
ส่วนที่ 2.3 "ตัวแปรท้องถิ่นสามารถเข้าถึงได้เมื่อใด" แสดงพฤติกรรมปัจจุบัน
เมื่อต้องการแก้ไขปัญหาการกำหนดขอบเขตสิ่งหนึ่งใน "แฮ็ค" ที่คุณต้องทำคือ:
ขอแนะนำให้คุณใส่คำสั่งการกำหนดเช่น = nil ก่อนที่จะเข้าถึงตัวแปรโลคอลเพื่อไม่ให้รบกวนพฤติกรรมของตัวแปรโลคอล
ฉันเชื่อว่า 1.9 จะลบความจำเป็นในการทำเช่นนี้และนี่อาจเป็นหนึ่งในไดรเวอร์สำหรับพฤติกรรมใหม่