ทำไมเอกสารในบางภาษาจึงพูดว่า "เทียบเท่า" แทนที่จะเป็น "?"


23

เหตุใดเอกสารในบางภาษาจึงพูดว่า "เทียบเท่า" แทนที่จะเป็น "?"

ตัวอย่างเช่นPython Docsพูด

itertools.chain(*iterables)

...

เทียบเท่ากับ:

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

หรือการอ้างอิง C ++บนfind_if:

พฤติกรรมของแม่แบบฟังก์ชั่นนี้เทียบเท่ากับ:

template<class InputIterator, class UnaryPredicate>
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last) {
    if (pred(*first)) return first;
    ++first;
  }
  return last;
}

หากไม่ใช่รหัสจริงพวกเขาไม่สามารถโพสต์ได้หรือไม่ และถ้าเป็นรหัสจริงทำไมพวกเขาถึงบอกว่ามันเป็น "เทียบเท่า" แทนที่จะเป็นเพียง "คือ"?


2
โปรดทราบว่าสิ่งที่คุณเห็นfind_ifเป็นไม่ได้ "ว่า" เอกสารสำหรับ C ++ ถ้าเป็นเช่นนั้นการโยนไปที่bool(ซึ่งคุณเห็นในคำตอบด้านล่าง) จะผิด
Mehrdad

3
ในกรณีของไพ ธ อนถ้าคุณมองหาซอร์สโค้ดคุณจะพบว่าchainมันถูกนำไปใช้โดยตรงใน C ดังนั้นมันจึงเป็น "เทียบเท่า" กับไพ ธ อนโค้ดนั้นเพราะมันให้ผลลัพธ์เดียวกัน แต่หลีกเลี่ยงการตีความที่ค่อนข้างเล็กน้อย bytecode
Bakuriu

@ Mehrdad ฉันรู้ว่ามันไม่ใช่เอกสารอย่างเป็นทางการมันเป็นเพียงทรัพยากรที่ฉันพบว่ามีประโยชน์มากที่สุดในการหาข้อมูลเฉพาะของ C ++
Jon McClung

พวกเขาจะถูกบังคับให้ใช้วิธีการใดก็ตามที่กำหนดไว้ในมาตรฐานแม้ว่าจะมีวิธีที่ดีกว่าก็ตาม
เควิน

คำตอบ:


67

เนื่องจากผู้เขียนมาตรฐานไม่ต้องการยืนยันการใช้งานจริง พวกเขาต้องการกำหนดสิ่งที่มันทำแต่ไม่จำเป็นว่ามันจะทำอย่างไร ตัวอย่างเช่นหากคุณดูที่GNU C ++ เวอร์ชันของfind_ifคุณจะเห็นว่าการใช้งานแตกต่างจากที่คุณให้เล็กน้อยซึ่งขึ้นอยู่กับมาตรฐาน C ++:

template<typename _InputIterator, typename _Predicate>
inline _InputIterator
__find_if(_InputIterator __first, _InputIterator __last,
    _Predicate __pred, input_iterator_tag)
{
    while (__first != __last && !bool(__pred(*__first)))
     ++__first;
       return __first;
}

สิ่งนี้เทียบเท่ากับมาตรฐานที่ใช้งานได้ แต่ไม่เหมือนกันทุกประการ สิ่งนี้ช่วยให้นักเขียนคอมไพเลอร์มีความยืดหยุ่น อาจมีวิธีที่ดีกว่าสำหรับแพลตฟอร์มเฉพาะ ผู้ดำเนินการอาจต้องการใช้รูปแบบการเข้ารหัสที่แตกต่างกัน

นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับสคริปต์ภาษาเช่นไพ ธ อนซึ่งผู้ดำเนินการอาจตัดสินใจใช้งานในภาษาที่แตกต่างอย่างสิ้นเชิงด้วยเหตุผลด้านประสิทธิภาพ ตัวอย่างเช่นบางคนที่ใช้ python อาจเขียนitertools.chain(*iterables)ด้วยภาษา C ++ นี่เป็นสิ่งที่สมบูรณ์แบบถ้ามาตรฐานบอกว่า "เทียบเท่ากับ" ตราบใดที่โค้ดทำหน้าที่เหมือนกับหลามที่ให้มา หากมาตรฐานกล่าวว่า "เป็น" แทนผู้ดำเนินการจะต้องดำเนินการในภาษานั้นหรือไม่เป็นไปตามมาตรฐาน

สรุป:

  1. เพราะพวกเขาไม่ต้องการป้องกันการใช้งานจากการเขียนรหัสที่ดีกว่ามาตรฐานที่มีให้
  2. เพราะพวกเขาไม่ต้องการป้องกันการใช้งานจากการใช้ภาษาที่แตกต่างกันอย่างสิ้นเชิงเพื่อปรับปรุงประสิทธิภาพ

ขอบคุณสำหรับคำตอบที่รู้แจ้ง! ฉันสงสัยว่าคำตอบคือบางสิ่งบางอย่างตามสายเหล่านั้น
Jon McClung

@lerenard คุณอาจพบว่า enlightening เพิ่มเติมเพื่ออ่านการใช้งาน find_if อย่างสมบูรณ์จากลิงก์ของ Steven (สิ่งที่เขาได้มามีเพียงแค่ข้อความที่ตัดตอนมาจริงๆ)
Winston Ewert

@ WinstonEwert แต่น่าเสียดายที่ฉันไม่ได้อยู่ในระดับที่เข้าใจรหัสอย่างเต็มที่ แต่การใช้ขีดเส้นใต้แบบเสรีนิยมนั้นเป็นจุดสนใจอย่างแน่นอน!
Jon McClung

9
@lerenard: ขีดเส้นใต้ที่นำเพิ่มเติมเหล่านั้นอยู่ที่นั่นเพื่อให้ไลบรารี่มาตรฐานภายในไม่รบกวนโค้ดที่คุณอาจเขียน (ชื่อที่มีเครื่องหมายขีดเส้นใต้สองชั้นนำสงวนไว้ให้ใช้โดยผู้เขียนคอมไพเลอร์ / ไลบรารีมาตรฐาน)
Bart van Ingen Schenau

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