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