Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

11 เคล็ดลับทับทิมที่คุณไม่เคยเห็นมาก่อน

กำลังมองหาลูกเล่น Ruby เจ๋ง ๆ อยู่หรือเปล่า

คุณเจอแล้ว!

ในบทความนี้ฉันต้องการแบ่งปันรายการโปรดของฉันกับคุณ

สารบัญ

  • 1 สำเนาลึก
  • 2 วิธีในการเรียกแลมบ์ดา
  • 3 การสร้างอาร์เรย์ที่เติมไว้ล่วงหน้า
  • 4 จริง เท็จ และ null เป็นวัตถุ
  • 5 Lambdas เข้มงวดเกี่ยวกับการโต้แย้ง แต่ Procs ไม่สนใจ
  • 6 รันโค้ดโดยตรงโดยไม่ต้องใช้ irb หรือไฟล์
  • 7 mini-irb ของคุณเองในคำสั่งเดียว
  • 8 ยกเลิกการตรึงวัตถุ (อันตราย!)
  • 9 วัตถุที่มีความพิเศษเฉพาะตัว
  • 10 หลีกเลี่ยงผลลัพธ์ขนาดใหญ่ใน irb หรือ pry
  • 11 การใช้วิธีการเรียกเพื่อรับสแต็กการโทรปัจจุบัน
  • 12 โบนัส! แปลงค่าใดๆ ให้เป็นบูลีน
  • 13 โบนัส! ใช้คำหลักเป็นชื่อตัวแปร
  • 14 สรุป
    • 14.1 ที่เกี่ยวข้อง

สำเนาลึก

เมื่อคุณ copy วัตถุที่มีวัตถุอื่น ๆ เช่น Array คัดลอกเฉพาะการอ้างอิงถึงวัตถุเหล่านี้เท่านั้น

คุณสามารถดูการดำเนินการได้ที่นี่:

food = %w( bread milk orange )
food.map(&:object_id)       # [35401044, 35401020, 35400996]
food.clone.map(&:object_id) # [35401044, 35401020, 35400996]

การใช้ Marshal คลาส ซึ่งปกติใช้สำหรับการทำให้เป็นอนุกรม คุณสามารถสร้าง 'สำเนาลึก' ของอ็อบเจ็กต์ได้

def deep_copy(obj)
  Marshal.load(Marshal.dump(obj))
end

ผลลัพธ์:

deep_copy(food).map(&:object_id) # [42975648, 42975624, 42975612]

วิธีต่างๆ ในการเรียกแลมบ์ดา

my_lambda = -> { puts 'Hello' }

my_lambda.call
my_lambda[]
my_lambda.()
my_lambda.===

ถ้าเป็นไปได้ คุณควรยึดติดกับอันแรก (call ) เพราะเป็นสิ่งที่คนส่วนใหญ่รู้จัก

การสร้างอาร์เรย์ที่เติมไว้ล่วงหน้า

คลาส Array สามารถรับอาร์กิวเมนต์ + บล็อก ซึ่งช่วยให้คุณสร้างอาร์เรย์ด้วย n องค์ประกอบ โดยค่าเริ่มต้น องค์ประกอบเหล่านี้จะ nil แต่ถ้าคุณมีบล็อก ค่าจะมาจากมัน

ตัวอย่าง :

Array.new(10) { rand 300 }

สิ่งนี้จะสร้างอาร์เรย์ที่มีตัวเลขสุ่ม 10 ตัวซึ่งอยู่ระหว่าง 0 ถึง 299

จริง เท็จ และ null เป็นวัตถุ

true.class  # TrueClass
false.class # FalseClass
nil.class   # NilClass

มีออบเจ็กต์เหล่านี้เพียงสำเนาเดียว และคุณไม่สามารถสร้างเพิ่มเติมได้แม้ว่าจะต้องการก็ตาม

นี่คือรูปแบบซิงเกิลตันที่ใช้งานจริง

แลมบ์ดาเข้มงวดเรื่องการโต้แย้ง แต่ Proc ไม่สนใจ

my_lambda = ->(a, b)  { a + b }
my_proc   = Proc.new  { |a, b| a + b }

my_lambda.call(2)
# ArgumentError: wrong number of arguments (1 for 2)

my_proc.call(2)
# TypeError: nil can't be coerced into Fixnum

รันโค้ดโดยตรงโดยไม่ต้องใช้ irb หรือไฟล์

ruby คำสั่งมีตัวเลือกที่น่าสนใจมากมายที่คุณสามารถใช้ได้

ตัวอย่างเช่น ด้วย -e ตั้งค่าสถานะคุณสามารถส่งผ่านในตัวอย่างโค้ดเพื่อดำเนินการได้

ruby -e '5.times { puts "Fun with Ruby" }'

คุณสามารถหาข้อมูลเพิ่มเติมโดยใช้ -h ธง.

mini-irb ของคุณเองในคำสั่งเดียว

เคยอยากรู้ว่า irb . เป็นอย่างไร ทำงาน? นี่เป็นเวอร์ชันที่ง่ายมาก

จำไว้ว่า 'REPL' ย่อมาจากอะไร:Read-Eval-Print Loop

ruby -n -e 'p eval($_)'

คุณจะไม่ได้รับข้อความแจ้ง แต่ให้พิมพ์รหัส Ruby ได้เลย

"A" * 5
"AAAAA"

ใช้งานได้เพราะ -n flag ทำสิ่งนี้:

-n    assume 'while gets(); ... end' loop around your script

และ $_ เป็นตัวแปรระดับโลก ซึ่งมีดังต่อไปนี้:

The last input line of string by gets or readline.

เลิกตรึงวัตถุ (อันตราย!)

ไม่มีวิธี Ruby ในการเลิกตรึงวัตถุ แต่ใช้ Fiddle คลาสที่คุณสามารถเข้าถึง Ruby internals เพื่อทำให้มันเกิดขึ้นได้

require 'fiddle'

str = 'water'.freeze
str.frozen? # true

memory_address = str.object_id * 2

Fiddle::Pointer.new(memory_address)[1] &= ~8

str.frozen? # false

อย่าลองทำที่บ้าน!

วัตถุที่มีเอกลักษณ์เฉพาะ

วัตถุทับทิมมีตัวระบุหรือหมายเลข 'id' ที่คุณสามารถเข้าถึงได้โดยใช้ object_id กระบวนการ. บางวัตถุมีรหัสคงที่:Fixnums, true, false &nil

false.object_id # 0
true.object_id  # 2
nil.object_id   # 4

1.object_id # 3
2.object_id # 5

Fixnum ids ใช้สูตรนี้:(หมายเลข * 2) + 1

โบนัส:Fixnum สูงสุดคือ 1073741823 หลังจากนั้นคุณจะได้วัตถุ Bignum

หลีกเลี่ยงเอาต์พุตขนาดใหญ่ใน irb หรือ pry

หากคุณกำลังทำงานใน irb และต้องการหลีกเลี่ยงการเติมหน้าจอของคุณด้วยเนื้อหาของอาร์เรย์หรือสตริงขนาดใหญ่จริงๆ คุณสามารถผนวก ; ที่ท้ายโค้ดของคุณ

ตัวอย่าง :

require 'rest-client'

RestClient.get('www.rubyguides.com');

ลองอีกครั้งโดยไม่มี ; ให้เห็นความแตกต่าง 🙂

การใช้วิธีการเรียกเพื่อรับสแต็กการโทรปัจจุบัน

นี่คือตัวอย่างโค้ด:

def foo
  bar
end

def bar
  puts caller
end

foo

ผลผลิต :

-:3:in 'foo'
-:10:in '<main>'

หากคุณต้องการชื่อเมธอดปัจจุบัน คุณสามารถใช้ __method__ หรือ __callee__ .

โบนัส! แปลงค่าใดๆ ให้เป็นบูลีน

!!(1)   # true
!!(nil) # false

โบนัส! ใช้คำหลักเป็นชื่อตัวแปร

def foo (if: nil)
  binding.local_variable_get(:if)
end

foo(if: true)

สรุป

ฉันหวังว่าคุณจะสนุกกับเทคนิค Ruby เหล่านี้!

แบ่งปันกับเพื่อน ๆ ของคุณเพื่อให้พวกเขาได้สนุกด้วย &สมัครรับข้อมูลบล็อกของฉัน ในแบบฟอร์มด้านล่างเพื่อที่คุณจะไม่พลาดโพสต์ต่อไปของฉัน 🙂