เรียนรู้ Python จาก Ruby; ความแตกต่างและความคล้ายคลึงกัน


131

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

ฉันกำลังมองหารายการที่คล้ายกับไพรเมอร์ที่ฉันเขียนสำหรับLearning Lua สำหรับ JavaScripters : สิ่งง่ายๆเช่นความสำคัญของช่องว่างและโครงสร้างแบบวนซ้ำ ชื่อของnilใน Python และค่าใดที่ถือว่าเป็น "จริง" มันเป็นสำนวนที่จะใช้เทียบเท่าmapและeachหรือพึมพำ บางสิ่งบางอย่างเกี่ยว กับรายการความเข้าใจพึมพำกับบรรทัดฐานหรือไม่?

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

แก้ไข : เพื่อความชัดเจนเป้าหมายของฉันคือ Python "เหมาะสม" และเป็นสำนวน หากมี Python เทียบเท่าinjectแต่ไม่มีใครใช้เพราะมีวิธีที่ดีกว่า / แตกต่างในการบรรลุฟังก์ชันการทำงานทั่วไปในการทำซ้ำรายการและสะสมผลลัพธ์ไปพร้อมกันฉันอยากรู้ว่าคุณทำสิ่งต่างๆอย่างไร บางทีฉันจะอัปเดตคำถามนี้ด้วยรายการเป้าหมายทั่วไปวิธีที่คุณบรรลุเป้าหมายใน Ruby และถามว่าสิ่งที่เทียบเท่าใน Python คืออะไร


1
สิ่งเดียวที่ฉันอ่านคือc2.com/cgi/wiki?PythonVsRubyฉันไม่ชอบตัวเองและการเยื้อง แต่ฉัน
ชิน

1
ที่เกี่ยวข้อง: stackoverflow.com/questions/1113611/… (ฉันไม่ค่อยแน่ใจว่ามันซ้ำกันหรือเปล่าเนื่องจากคำถามนั้นถามถึงสิ่งที่ไม่มีสิ่งที่เทียบเท่า)

19
@SilentGhost ฉันไม่เห็นด้วยอย่างยิ่ง ฉันกำลังถามว่า "ภาษาอะไรเหมือนกันและอะไรที่แตกต่างกัน" ดังที่แสดงไว้ในคำตอบด้านล่างนี้มีคำตอบที่ชัดเจนและเป็นประโยชน์สำหรับเรื่องนี้
Phrogz

3
@Phrogz: ฉันเห็นสิ่งนั้นและทำให้คำถามไม่สามารถตอบได้
SilentGhost

2
@Phrongz - เพื่อสะท้อนสิ่งที่ฉันพูดในหัวข้อเมตาที่คุณโพสต์ปัญหาของคำถามนี้คือช่องว่างของปัญหามีขนาดใหญ่เกินไป - หัวข้อใหญ่เกินไปสำหรับคำถามเดียวเท่านั้น มีความแตกต่างมากมายระหว่างสองภาษา
Adam Davis

คำตอบ:


153

นี่คือความแตกต่างที่สำคัญสำหรับฉัน:

  1. ทับทิมมีบล็อก Python ไม่ได้

  2. Python มีฟังก์ชัน; ทับทิมไม่ได้ ใน Python คุณสามารถใช้ฟังก์ชันหรือวิธีการใดก็ได้และส่งต่อไปยังฟังก์ชันอื่น ใน Ruby ทุกอย่างเป็นวิธีการและไม่สามารถส่งผ่านวิธีการได้โดยตรง แต่คุณต้องห่อไว้ใน Proc เพื่อส่งต่อ

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

  4. Python มีความเข้าใจในรายการซึ่งแสดงออกได้ค่อนข้างชัดเจน ตัวอย่างเช่นหากคุณมีรายการตัวเลขคุณสามารถเขียนได้

    [x*x for x in values if x > 15]

    เพื่อให้ได้รายการใหม่ของค่ากำลังสองของค่าทั้งหมดที่มากกว่า 15 ใน Ruby คุณจะต้องเขียนสิ่งต่อไปนี้:

    values.select {|v| v > 15}.map {|v| v * v}

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

    Python ยังให้ความเข้าใจแผนที่ที่คล้ายกัน

  5. Python รองรับ tuples; ทับทิมไม่ได้ ใน Ruby คุณต้องใช้อาร์เรย์เพื่อจำลองสิ่งทูเปิล

  6. Ruby รองรับคำสั่ง switch / case; Python ไม่ได้

  7. Ruby รองรับตัวexpr ? val1 : val2ดำเนินการ ternary มาตรฐาน Python ไม่ได้

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

  9. Python รองรับฟังก์ชันแลมด้าบรรทัดเดียวเท่านั้น บล็อก Ruby ซึ่งเป็นฟังก์ชันแลมบ์ดา / ประเภทสามารถมีขนาดใหญ่ได้ตามอำเภอใจ ด้วยเหตุนี้รหัส Ruby จึงมักเขียนในรูปแบบที่ใช้งานได้ดีกว่ารหัส Python ตัวอย่างเช่นในการวนซ้ำรายการใน Ruby คุณมักจะทำ

    collection.each do |value|
      ...
    end

    collection.eachบล็อกการทำงานอย่างมากเช่นฟังก์ชั่นที่ถูกส่งผ่านไปยัง หากคุณจะทำสิ่งเดียวกันใน Python คุณจะต้องกำหนดฟังก์ชันภายในที่มีชื่อแล้วส่งต่อไปยังคอลเลกชันแต่ละวิธี (หากรายการรองรับวิธีนี้):

    def some_operation(value):
      ...
    
    collection.each(some_operation)

    ที่ไม่ไหลลื่นมาก ดังนั้นโดยทั่วไปแล้ววิธีการที่ไม่ใช้งานต่อไปนี้จะถูกใช้ใน Python:

    for value in collection:
      ...
  10. การใช้ทรัพยากรอย่างปลอดภัยนั้นค่อนข้างแตกต่างกันระหว่างสองภาษา ที่นี่ปัญหาคือคุณต้องการจัดสรรทรัพยากรบางอย่าง (เปิดไฟล์รับเคอร์เซอร์ฐานข้อมูล ฯลฯ ) ดำเนินการตามอำเภอใจจากนั้นปิดอย่างปลอดภัยแม้ว่าจะมีข้อยกเว้นเกิดขึ้นก็ตาม

    ใน Ruby เนื่องจากบล็อกใช้งานง่ายมาก (ดู # 9) โดยทั่วไปคุณจะเขียนโค้ดรูปแบบนี้เป็นวิธีการที่ใช้บล็อกสำหรับการดำเนินการโดยพลการเพื่อดำเนินการกับทรัพยากร

    ใน Python การส่งผ่านฟังก์ชั่นสำหรับการกระทำโดยพลการนั้นมีความซับซ้อนกว่าเล็กน้อยเนื่องจากคุณต้องเขียนชื่อฟังก์ชันภายใน (ดู # 9) Python ใช้withคำสั่งเพื่อความปลอดภัยในการจัดการทรัพยากร ดูฉันจะล้างวัตถุ Python อย่างถูกต้องได้อย่างไร สำหรับรายละเอียดเพิ่มเติม


2
3. Python 3 nonlocalแก้ไขสิ่งนี้ 4. Python ยังให้นิพจน์เครื่องกำเนิดไฟฟ้า (คล้ายกับการทำความเข้าใจรายการ แต่อย่าคำนวณอะไรเลยจนกว่าจะถูกถาม - คิดว่าการเข้าใจรายการเป็นนิพจน์ตัวสร้างที่ป้อนlist(ซึ่งใช้เวลาในการทำซ้ำและส่งคืนรายการที่มีทุกอย่าง ผลตอบแทนที่ทำซ้ำได้) - สิ่งนี้สามารถประหยัดความพยายามได้มากในบางกรณี)

25
7. ใช่ val1 if expr else val2. 8. แม้ว่าฉันจะเห็นว่าส่วนใหญ่ใช้สำหรับการเสริมสไตล์มิกซ์อิน

2
@ClintMiller โอ้วไม่มีสวิตช์ / เคส? วิธีที่แนะนำเพื่อให้บรรลุฟังก์ชันการทำงานที่คล้ายกันใน Python คืออะไร? หาก / อื่น ๆ / ถ้า?
Phrogz

15
ตัวอย่างทับทิมของคุณใน # 4 ไม่ใช่สำนวน มันจะมีมากขึ้นทับทิม ish (และสามารถอ่านได้) values.map{|v| v*v if v > 15}.compactในการเขียน IMHO นี่เป็นการแสดงออก (และชัดเจนกว่า) มากกว่าตัวอย่าง python ของคุณ
sml

10
นอกเหนือจากข้างต้นแล้วการใช้! values.map{|v| v*v if v > 15}.compact!รุ่นของฟังก์ชั่นที่มีขนาดกะทัดรัดหลีกเลี่ยงสำเนาของอาร์เรย์: ซึ่งหมายความว่ามีเฉพาะรายการอินพุตและรายการผลลัพธ์ที่มีอยู่ในหน่วยความจำ ดู # 4 ที่นี่: igvita.com/2008/07/08/6-optimization-tips-for-ruby-mri
sml

27

ฉันเพิ่งใช้เวลาสองสามเดือนในการเรียนรู้ Python หลังจาก 6 ปีของ Ruby ไม่มีการเปรียบเทียบที่ยอดเยี่ยมสำหรับสองภาษานี้จริงๆดังนั้นฉันจึงตัดสินใจที่จะเขียนและเขียนด้วยตัวเอง ตอนนี้ก็เป็นห่วงส่วนใหญ่กับการเขียนโปรแกรมการทำงาน แต่เนื่องจากคุณพูดถึงทับทิมinjectวิธีผมคาดเดาที่เรากำลังในความยาวคลื่นเดียวกัน

ฉันหวังว่านี่จะช่วยได้: 'ความอัปลักษณ์' ของ Python

สองจุดที่จะทำให้คุณก้าวไปในทิศทางที่ถูกต้อง:

  • ความดีในการเขียนโปรแกรมที่ใช้งานได้ทั้งหมดที่คุณใช้ใน Ruby อยู่ใน Python และง่ายยิ่งกว่านั้น ตัวอย่างเช่นคุณสามารถแมปฟังก์ชันได้ตรงตามที่คุณคาดหวัง:

    def f(x):
        return x + 1
    
    map(f, [1, 2, 3]) # => [2, 3, 4]
  • Python ไม่มีเมธอดที่ทำหน้าที่เหมือนeach. เนื่องจากคุณใช้eachสำหรับผลข้างเคียงเท่านั้นสิ่งที่เทียบเท่าใน Python คือ for loop:

    for n in [1, 2, 3]:
        print n
  • ความเข้าใจในรายการเป็นสิ่งที่ดีเมื่อ a) คุณต้องจัดการกับฟังก์ชันและคอลเลกชันออบเจ็กต์ร่วมกันและ b) เมื่อคุณต้องทำซ้ำโดยใช้ดัชนีหลายตัว ตัวอย่างเช่นหากต้องการค้นหา palindromes ทั้งหมดในสตริง (สมมติว่าคุณมีฟังก์ชันp()ที่ส่งกลับค่า true สำหรับ palindromes) สิ่งที่คุณต้องมีคือความเข้าใจในรายการเดียว:

    s = 'string-with-palindromes-like-abbalabba'
    l = len(s)
    [s[x:y] for x in range(l) for y in range(x,l+1) if p(s[x:y])]

3
เฮ้อฉันอ่านโพสต์นั้นและยืนยันความสงสัยของฉัน: มีคนเพียงไม่กี่คนที่เข้าใจบทบาทและประโยชน์ของวิธีการพิเศษใน Python มีประโยชน์และเป็นมาตรฐานอย่างไม่น่าเชื่อและมีการเน้นย้ำเพื่อหลีกเลี่ยงการตั้งชื่อที่ขัดแย้งกับบิวด์อินที่มักใช้ ไม่มีใครรู้ว่า Python พยายามกีดกันการใช้งาน
Rafe Kettler

5
ดูเหมือนคุณจะไม่เข้าใจวิธีการทำงาน โดยพื้นฐานแล้ววิธีการคือฟังก์ชันที่มีอาร์กิวเมนต์แรกเป็นอินสแตนซ์ของคลาสที่เมธอดอยู่ เมื่อคุณเขียนClass.methodเมธอดคือ "unbound" และอาร์กิวเมนต์แรกควรเป็นClassอินสแตนซ์ เมื่อคุณเขียนobject.methodวิธีการคือ "ผูกพัน" กับอินสแตนซ์object Classวิธีนี้ช่วยให้คุณสามารถเลือกได้ว่าจะใช้ map (ฯลฯ ) เพื่อเรียกใช้เมธอดบนอินสแตนซ์ที่แตกต่างกันในแต่ละครั้ง (ส่งผ่านวิธี unbound) หรือเพื่อให้อินสแตนซ์คงที่และส่งผ่านอาร์กิวเมนต์ที่สองที่แตกต่างกันในแต่ละครั้ง ทั้งสองมีประโยชน์
LaC

2
คุณพูดถูกฉันไม่เข้าใจว่าพวกเขาทำงานอย่างไร ตั้งแต่เผยแพร่บทความฉันก็รู้สึกดีขึ้น ขอบคุณ!
David J.

10
[s[x:y] for x in range(l) for y in range(x,l+1) if p(s[x:y])]- บรรทัดนี้แสดงให้เห็นว่า Python ยากสำหรับการอ่านอย่างไร เมื่อคุณอ่านรหัส Ruby คุณจะเลื่อนสายตาจากซ้ายไปขวาโดยไม่ส่งคืน แต่ในการอ่านโค้ด Python คุณต้องไปทางซ้าย - ขวา - ซ้าย - ขวา - ซ้าย - ขวา ... และวงเล็บ, วงเล็บ, วงเล็บ, วงเล็บ ... นอกจากนี้ใน Python คุณมักจะต้องผสมวิธีการและฟังก์ชัน มันเป็นความบ้าคลั่ง: E(C(A.B()).D())แทนที่จะเป็นทับทิมA.B.C.D.E
นาคิลอน

2
@ Nakilon นั่นเป็นเหตุผลที่คุณควรใช้เฉพาะความเข้าใจในรายการที่ซ้อนกันสำหรับกรณีง่าย ๆ เท่านั้นไม่ใช่อย่างที่กล่าวมาข้างต้น มันอาจจะ 'ฉลาด' ในการเขียน one-liner ที่ค้นหา palindromes ทั้งหมดในสตริง แต่ควรสงวนไว้สำหรับ code golf สำหรับโค้ดจริงที่คนอื่นต้องอ่านในภายหลังคุณจะต้องเขียนฟังก์ชันสองสามบรรทัด ใช่บรรทัดนั้นอ่านยาก แต่นั่นเป็นความผิดของโปรแกรมเมอร์ไม่ใช่ภาษา
Cam Jackson

10

ข้อเสนอแนะของฉัน: อย่าพยายามเรียนรู้ความแตกต่าง เรียนรู้วิธีแก้ไขปัญหาใน Python เช่นเดียวกับที่มีวิธี Ruby ในแต่ละปัญหา (ซึ่งทำงานได้ดีมากในการ จำกัด ข้อ จำกัด และจุดแข็งของภาษา) มีวิธีการ Python ในการแก้ปัญหา ทั้งสองต่างกัน เพื่อให้ได้รับประโยชน์สูงสุดจากแต่ละภาษาคุณควรเรียนรู้ภาษานั้น ๆ ไม่ใช่แค่ "การแปล" จากภาษาหนึ่งไปยังอีกภาษาหนึ่ง

จากที่กล่าวไปความแตกต่างจะช่วยให้คุณปรับตัวได้เร็วขึ้นและทำการแก้ไข 1 รายการกับโปรแกรม Python และนั่นก็ดีสำหรับการเริ่มเขียน แต่พยายามเรียนรู้จากโครงการอื่น ๆ ถึงสาเหตุที่อยู่เบื้องหลังสถาปัตยกรรมและการตัดสินใจในการออกแบบมากกว่าเบื้องหลังความหมายของภาษา ...


7
ฉันขอขอบคุณสำหรับข้อเสนอแนะของคุณ ข้าพเจ้าได้เห็นด้วยกับความเชื่อมั่น(ซึ่งผมตีความว่า "เรียนรู้การเขียนโปรแกรมสำนวนงูใหญ่") นั่นคือสิ่งที่ฉันพยายามทำ ฉันไม่ได้ถามว่า"Python ชื่ออะไรสำหรับeachวิธีการของ Ruby " ฉันกำลังถามว่า"สิ่งที่ทำอย่างถูกต้องใน Python แตกต่างจาก Ruby อย่างไรและสิ่งเหล่านี้ทำอย่างถูกต้องเหมือนกันที่ไหน" ถ้า Python falseเป็นจริงFalseสิ่งสำคัญคือต้องรู้ว่าฉันควรทำสิ่งต่าง ๆ ในลักษณะ Rubyesque ที่ไหนและเมื่อไหร่และที่ไหนและเมื่อใดที่ฉันไม่ควร
Phrogz

2
@Phrogz: มันยุติธรรม วิธีที่ผมตีความคำถามของคุณคือ: ขอให้รายการของความแตกต่างเพื่อเราก็สามารถเปลี่ยนภาษาที่เราเขียนโปรแกรมอยู่ใน แต่เป็นคำถามที่ยุติธรรม ฉันเดาว่าฉันแค่ตีความสิ่งที่คุณขอผิด ฉันจะทิ้งไว้ที่นี่เพื่ออ้างอิง แต่มันน่าสนใจที่จะได้เห็นว่ามีอะไรอีกบ้าง ...
ircmaxell

ฉันกำลังเรียนรู้ python และ Ruby ในเวลาเดียวกันและใน web app dev ฉันเห็นความเหมือนมากกว่าความแตกต่าง
WesternGun

8

ฉันรู้จัก Ruby ตัวน้อย แต่นี่เป็นหัวข้อย่อยเกี่ยวกับสิ่งที่คุณพูดถึง:

  • nilค่าที่ระบุว่าไม่มีค่าจะเป็นNone(โปรดทราบว่าคุณตรวจสอบว่าเหมือนx is Noneหรือx is not Noneไม่ใช่ด้วย==- หรือโดยการบีบบังคับให้บูลีนดูจุดถัดไป)
  • Noneศูนย์ฟีเจอร์ตัวเลข ( 0, 0.0, 0j(จำนวนเชิงซ้อน)) และคอลเลกชันที่ว่างเปล่า ( [], {}, set(), สตริงที่ว่างเปล่า""และอื่น ๆ ) ได้รับการพิจารณา falsy ทุกอย่างอื่นถือว่า truthy
  • สำหรับผลข้างเคียงให้forวนซ้ำ( -) อย่างชัดเจน สำหรับการสร้างสิ่งใหม่ ๆ ที่ไม่มีผลข้างเคียงให้ใช้การทำความเข้าใจรายการ (หรือญาติของพวกเขา - นิพจน์กำเนิดสำหรับผู้ทำซ้ำครั้งเดียวที่ขี้เกียจเขียนตามคำบอก / ตั้งค่าความเข้าใจสำหรับคอลเล็กชันดังกล่าว)

เกี่ยวกับการวนซ้ำ: คุณมีforซึ่งดำเนินการซ้ำได้ (! ไม่นับ) และwhileซึ่งทำในสิ่งที่คุณคาดหวัง fromer นั้นทรงพลังกว่ามากด้วยการสนับสนุนที่กว้างขวางสำหรับตัวทำซ้ำ ไม่เพียง แต่เกือบทุกอย่างที่สามารถเป็นตัววนซ้ำแทนรายการได้คือตัววนซ้ำ (อย่างน้อยใน Python 3 - ใน Python 2 คุณมีทั้งสองอย่างและค่าเริ่มต้นคือรายการน่าเศร้า) มีเครื่องมือมากมายสำหรับการทำงานกับเครื่องวนซ้ำ - zipวนซ้ำจำนวนซ้ำ ๆ แบบขนานenumerateให้คุณ(index, item)(ในการทำซ้ำไม่ใช่เฉพาะในรายการ) แม้แต่การตัดซ้ำแบบผิด ๆ (อาจมีขนาดใหญ่หรือไม่สิ้นสุด)! ฉันพบว่าสิ่งเหล่านี้ทำให้งานวนซ้ำหลาย ๆ อย่างง่ายขึ้นมาก ไม่จำเป็นต้องพูดพวกเขารวมเข้าด้วยกันได้ดีกับความเข้าใจรายการนิพจน์ตัวสร้าง ฯลฯ


2
นิพจน์ Generator นั้นยอดเยี่ยม พวกเขาให้ความสามารถในการประเมินภาษาที่ขี้เกียจของ Python เช่น Haskell
Clint Miller

@ คลินท์: ใช่ และเครื่องกำเนิดไฟฟ้าเต็มรูปแบบก็มีความสามารถมากขึ้น (แม้ว่าจะไม่จำเป็นสำหรับกรณีธรรมดาซึ่งเป็นส่วนใหญ่)

ทำไมคุณถึงตรวจสอบด้วยx is Noneหรือx is not None? ฉันมักจะตรวจสอบกับและx == None x != None
John

@ จอห์น: ถ้าxนิยาม__eq__แบบโง่ ๆ มันอาจให้ผลบวกผิด ๆ หาก__eq__ไม่ได้ตั้งโปรแกรมไว้อย่างรอบคอบเพียงพออาจเกิดข้อผิดพลาด (เช่นAttributeError) เมื่อกำหนดค่าบางอย่าง (เช่นNone) ในทางตรงกันข้ามisไม่สามารถลบล้างได้ - มันจะเปรียบเทียบเอกลักษณ์ของวัตถุเสมอซึ่งเป็นวิธีที่ถูกต้อง (แข็งแกร่งที่สุดง่ายที่สุดและสะอาดที่สุด) ในการตรวจสอบซิงเกิลตัน

1
@จอห์น. "x is None" เป็นวิธีการใช้สำนวนที่แน่นอน python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
tokland

6

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

ใน Python เมธอดเป็นเพียงคลาสพิเศษของแอ็ตทริบิวต์: วิธีหนึ่งที่เรียกใช้งานได้

ตัวอย่างเช่น:

>>> class foo:
...     x = 5
...     def y(): pass
... 
>>> f = foo()
>>> type(f.x)
<type 'int'>
>>> type(f.y)
<type 'instancemethod'>

ความแตกต่างนั้นมีความหมายหลายอย่างเช่นการอ้างถึง fx หมายถึง method object แทนที่จะเรียกมัน อย่างที่คุณเห็น fx เป็นสาธารณะโดยค่าเริ่มต้นในขณะที่ใน Ruby ตัวแปรอินสแตนซ์จะเป็นแบบส่วนตัวตามค่าเริ่มต้น


2
อันที่จริงฉันจะระบุให้ชัดเจนยิ่งขึ้น: ใน Python วิธีการเป็นเพียงแอตทริบิวต์ประเภทหนึ่งในขณะที่ใน Ruby แอตทริบิวต์เป็นเพียงวิธีการเฉพาะ คุณสมบัติที่แตกต่างที่สำคัญบางประการระหว่างสองภาษานี้หลุดออกไป: ฟังก์ชั่นชั้นหนึ่งใน Python และหลักการการเข้าถึงเครื่องแบบใน Ruby
ปรัชญา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.