12 คะแนน โดย GN⁺ 2024-06-24 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • ผู้คนมักเชื่อมโยง Ruby เข้ากับเฟรมเวิร์ก Rails เป็นหลัก จนลืมจุดเด่นที่ยอดเยี่ยมของภาษานี้ไป
  • Ruby เป็นภาษาที่สมบูรณ์และมีความสามารถรอบด้านมาก โดยเฉพาะมีประโยชน์เมื่อต้องเขียนเชลล์สคริปต์ที่ซับซ้อน
  • เป้าหมายของบทความนี้
    • แสดงความสามารถของ Ruby ที่มีประโยชน์เวลาเขียนเชลล์สคริปต์ และเปรียบเทียบกับ Bash และ Python
    • ไม่ได้หมายความว่าจะให้แทนที่ Bash script ด้วย Ruby script ทั้งหมด

ความสามารถ 1: เรียกใช้คำสั่งภายนอก

  • ใน Ruby การเรียกใช้คำสั่งภายนอกใช้ backtick(```)
  • ตัวอย่างเช่น เมื่อใช้ backtick สามารถเก็บผลลัพธ์ของคำสั่งภายนอกไว้ในตัวแปรได้
  • สามารถใช้ system หรือ popen ได้เช่นกัน
    `ls`  
    
  • สามารถเก็บผลลัพธ์ของคำสั่งไว้ในตัวแปรได้
    my_date=`date`  
    
โฆษณา

ความสามารถ 2: รหัสสถานะ

  • สามารถใช้ตัวแปร $? เพื่อตรวจสอบรหัสสถานะของคำสั่งล่าสุดได้
  • คล้ายกับ Bash มาก
    `true`  
    puts $? # 0  
    `false`  
    puts $? # 1  
    

ความสามารถ 3: ภาษาแบบมีชนิดข้อมูล

  • Ruby ไม่ใช่ภาษาที่มีชนิดข้อมูลแบบสแตติก แต่ก็มีชนิดข้อมูล
  • เป็นภาษาเชิงวัตถุ โดยทุกอย่างถูกปฏิบัติเป็นออบเจ็กต์
  • ต่างจาก Bash ตรงที่สามารถใช้ชนิดข้อมูลอื่นนอกเหนือจากสตริงได้อย่างปลอดภัย
    total_lines = `wc -l my_file`.to_i # จำนวนเต็มที่เก็บจำนวนบรรทัดของไฟล์  
    half = total_lines.div 2           # การหารจำนวนเต็ม  
    puts `head -n #{half} my_file`     # แสดงครึ่งหนึ่งของไฟล์  
    

ความสามารถ 4: การประกอบแบบฟังก์ชัน

  • Ruby มีโอเปอเรชันเชิงฟังก์ชันอย่าง map, select (filter), reduce, flat_map ในรูปแบบเมธอด
  • สามารถใช้ map กับผลลัพธ์ของคำสั่งได้
    puts `ls`.lines.map { |name| name.strip.length } # แสดงความยาวของชื่อไฟล์  
    
    โฆษณา

ความสามารถ 5: การแมตช์ด้วย regular expression

  • ใน Ruby regular expression เป็นชนิดข้อมูล และมีโอเปอเรชันที่ใช้ regular expression ติดมากับภาษา
  • ตัวอย่างเช่น วิธีดึงชื่อ git branch ปัจจุบัน:
    current_branch_regex = /^\* (\S+)/  
    output_lines = `git branch`.lines  
    output_lines.each do |line|  
      if line =~ current_branch_regex # แมตช์ระหว่างสตริงกับ regular expression  
        puts $1                       # แสดงผลลัพธ์ที่แมตช์ของกลุ่มแรก  
      end  
    end  
    

ความสามารถ 6: เธรดที่ใช้งานง่าย

  • Ruby ทำให้การจัดการหลายเธรดเป็นเรื่องง่ายมาก
  • ตัวอย่างเช่น มีประโยชน์เมื่อดาวน์โหลดหลายไฟล์พร้อมกัน
    (1..10).map do |i|                       # วนซ้ำตั้งแต่ 1 ถึง 10  
      Thread.new do  
        `wget http://my_site.com/file_#{i}`  # สามารถใช้ตัวแปรภายในคำสั่งได้  
      end  
    end.each { |thread| thread.join }        # do/end และวงเล็บปีกกามีจุดประสงค์เดียวกัน  
    
    โฆษณา

ความสามารถ 7: งานไฟล์และไดเรกทอรีที่มีมาในตัว

  • ใน Ruby การจัดการไฟล์ทั้งหมดมีให้ผ่านเมธอดของคลาส File และการจัดการไดเรกทอรีผ่านเมธอดของคลาส Dir
  • ต่างจาก Python ตรงที่สามารถจัดการไฟล์และไดเรกทอรีได้อย่างสม่ำเสมอในแนวทางเดียวกัน
    exists = File.exists? 'My File'           # เมธอดที่คืนค่า boolean จะลงท้ายด้วย '?'  
    file_content = File.open('My File').read  
    File.delete 'My File'                     # หากไม่กำกวม วงเล็บเป็นสิ่งที่ใส่หรือไม่ใส่ก็ได้  
    

บทสรุป

  • แนะนำให้พิจารณา Ruby เมื่อต้องการแทนที่เชลล์สคริปต์ที่ซับซ้อน
  • แน่นอนว่าไม่ได้หมายความให้เลิกใช้ Bash ไปเลย แต่ในงานที่ซับซ้อน Ruby อาจเป็นตัวเลือกที่ดีกว่า
  • แม้จะทำได้ด้วย Python, Perl, JS เป็นต้น แต่ในมุมมองส่วนตัว Ruby คือภาษาที่สมบูรณ์ที่สุดและใช้งานง่ายที่สุด

ความเห็นของ GN⁺

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

3 ความคิดเห็น

 
yangeok 2024-07-05

เอามาใช้ทำสคริปต์ก็ดูโอเคนะ 555 ไม่รู้ว่าเป็นเวอร์ชันไหน แต่บน Mac ก็ติดตั้งมาให้เป็นค่าเริ่มต้นอยู่แล้วไม่ใช่เหรอ,,?!

 
botplaysdice 2024-06-24

Ruby ที่เคยชื่นชอบมาก่อน... หวังว่ามันจะยังคงเป็นภาษาที่ได้รับความรักมากในแบบนี้ต่อไปนะครับ/ค่ะ

 
GN⁺ 2024-06-24
ความคิดเห็นบน Hacker News
  • Ruby สืบทอดความสามารถด้านการเขียนเชลล์สคริปต์มามากจาก Perl และมีตัวเลือกที่ช่วยเพิ่มความอ่านง่ายได้แบบค่อยเป็นค่อยไป
  • สามารถดีบักแบบโต้ตอบได้ภายในสคริปต์ด้วย binding.irb หรือ binding.pry
  • การใช้ Pathname ให้ API ที่เป็นธรรมชาติกว่า File
  • สามารถใช้แบ็กติก (`) เพื่อรันคำสั่งเชลล์แบบง่าย ๆ ได้ แต่ถ้างานซับซ้อนกว่านั้นก็สามารถใช้ standard library ของ Ruby ได้
  • เธรดของ Ruby ใช้งานง่าย และถ้าใช้ Parallel ก็จะทำให้การประมวลผลแบบขนานสะดวกยิ่งขึ้น
  • Ruby 2.6 ที่ติดตั้งมาเป็นค่าเริ่มต้นบน MacOS ยังพอใช้งานได้ แต่ควรอัปเกรดเป็นเวอร์ชันล่าสุด
  • Ruby เป็นภาษาที่ดีมาก แต่การรองรับจากเอดิเตอร์ยังด้อยกว่า Python
  • การใช้แบ็กติก (`) เพื่อรันคำสั่งเชลล์นั้นไม่มีประสิทธิภาพ และอาจทำงานต่างกันไปตามระบบปฏิบัติการ
  • ความสามารถในการจัดการ dependency แบบ inline ของ Ruby มีประโยชน์มาก และให้ฟังก์ชันที่คล้ายกับ Deno
  • Ruby ทำให้เขียนโค้ดที่สวยงามได้ และเหมาะกับการเขียนสคริปต์ขนาดเล็ก
  • Ruby มีประโยชน์มากสำหรับการเขียนสคริปต์อัตโนมัติที่ซับซ้อน และทำงานได้ง่ายกว่า bash หรือ powershell
  • Ruby ยังคงถูกใช้มากในการเขียนสคริปต์และเครื่องมือต่าง ๆ ในบริษัทที่ใช้ Rails monolith ขนาดใหญ่
  • ในสภาพแวดล้อมที่ไม่สามารถเข้าถึงอินเทอร์เน็ตได้ การใช้ภาษาที่ติดตั้งมากับดิสทริบิวชันพื้นฐานเป็นสิ่งสำคัญ
  • Ruby มีประโยชน์สำหรับการเขียนสคริปต์ shell autocomplete และสามารถสร้างยูทิลิตีได้อย่างรวดเร็ว Rails เหมาะกับการทำ MVP