ฉันจะกำหนดวิธีการในหนึ่งบรรทัดใน Ruby ได้อย่างไร


92

เป็นdef greet; puts "hello"; endวิธีเดียวในการกำหนดวิธีการในหนึ่งบรรทัดใน Ruby หรือไม่?


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

คำตอบ:



76

เพียงแค่ให้คำตอบใหม่ทั้งหมด:

โดยทั่วไปหลีกเลี่ยงวิธีบรรทัดเดียว แม้ว่าพวกเขาจะได้รับความนิยมอยู่บ้าง แต่ก็มีลักษณะเฉพาะบางประการเกี่ยวกับไวยากรณ์คำจำกัดความที่ทำให้การใช้งานไม่เป็นที่ต้องการ ในอัตราใด ๆ - ไม่ควรมี มากกว่าหนึ่งนิพจน์ในวิธีการบรรทัดเดียว

# bad
def too_much; something; something_else; end

# okish - notice that the first ; is required
def no_braces_method; body end

# okish - notice that the second ; is optional
def no_braces_method; body; end

# okish - valid syntax, but no ; make it kind of hard to read
def some_method() body end

# good
def some_method
  body
end

ข้อยกเว้นประการหนึ่งของกฎคือวิธีการที่ไม่มีเนื้อหา

# good
def no_op; end

จากbbatsov / Ruby-style-guide .


39
def add a,b; a+b end

อัฒภาคเป็นตัวยุติคำสั่งแบบอินไลน์สำหรับ Ruby

หรือคุณสามารถใช้define_methodวิธี (แก้ไข: คนนี้เลิกใช้ใน Ruby 1.9)

define_method(:add) {|a,b| a+b }

4
ดูเหมือนจะไม่มีการเลิกใช้งานใน Ruby 2+
michau

9

อีกวิธีหนึ่ง:

define_method(:greet) { puts 'hello' }

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


NoMethodError: เมธอดส่วนตัว `define_method 'เรียกสำหรับ Object: Class ใน Ruby 1.9.3
Jared

3
define_methodได้รับการ "แปรรูป" ใน Ruby 1.9
edgerunner

8

อีกวิธีหนึ่ง:

def greet() return 'Hello' end

13
ใน Ruby ค่าส่งคืนของวิธีการคือค่าที่ส่งคืนโดยคำสั่งสุดท้าย คุณไม่ต้องการที่returnนี่เพราะมันไม่ใช่คำสั่งยาม
Damien

1
ได้รับการโหวตเนื่องจากแม้ว่าจะไม่จำเป็นแต่returnก็สามารถเพิ่มความสามารถในการอ่านสำหรับผู้ที่ไม่ค่อยมีประสบการณ์ใน (หรือคุ้นเคยกับ) Ruby เป็นหนึ่งในสิ่งที่YMMV ...
Potherca
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.