Ruby - Hướng dẫn nhanh

Ruby là một ngôn ngữ lập trình hướng đối tượng thuần túy. Nó được tạo ra vào năm 1993 bởi Yukihiro Matsumoto của Nhật Bản.

Bạn có thể tìm thấy tên Yukihiro Matsumoto trong danh sách gửi thư của Ruby tại www.ruby-lang.org . Matsumoto còn được gọi là Matz trong cộng đồng Ruby.

Ruby is "A Programmer's Best Friend".

Ruby có các tính năng tương tự như của Smalltalk, Perl và Python. Perl, Python và Smalltalk là các ngôn ngữ kịch bản. Smalltalk là một ngôn ngữ hướng đối tượng thực sự. Ruby, giống như Smalltalk, là một ngôn ngữ hướng đối tượng hoàn hảo. Sử dụng cú pháp Ruby dễ dàng hơn nhiều so với sử dụng cú pháp Smalltalk.

Đặc điểm của Ruby

  • Ruby là một mã nguồn mở và có sẵn miễn phí trên Web, nhưng nó phải có giấy phép.

  • Ruby là một ngôn ngữ lập trình thông dịch, có mục đích chung.

  • Ruby là một ngôn ngữ lập trình hướng đối tượng thực sự.

  • Ruby là một ngôn ngữ kịch bản phía máy chủ tương tự như Python và PERL.

  • Ruby có thể được sử dụng để viết các tập lệnh Giao diện Cổng chung (CGI).

  • Ruby có thể được nhúng vào Ngôn ngữ đánh dấu siêu văn bản (HTML).

  • Ruby có một cú pháp rõ ràng và dễ dàng cho phép một nhà phát triển mới học rất nhanh và dễ dàng.

  • Ruby có cú pháp tương tự như cú pháp của nhiều ngôn ngữ lập trình như C ++ và Perl.

  • Ruby có rất nhiều khả năng mở rộng và các chương trình lớn được viết bằng Ruby có thể dễ dàng bảo trì.

  • Ruby có thể được sử dụng để phát triển các ứng dụng Internet và mạng nội bộ.

  • Ruby có thể được cài đặt trong môi trường Windows và POSIX.

  • Ruby hỗ trợ nhiều công cụ GUI như Tcl / Tk, GTK và OpenGL.

  • Ruby có thể dễ dàng được kết nối với DB2, MySQL, Oracle và Sybase.

  • Ruby có một tập hợp các hàm tích hợp phong phú, có thể được sử dụng trực tiếp vào các tập lệnh Ruby.

Công cụ bạn sẽ cần

Để thực hiện các ví dụ được thảo luận trong hướng dẫn này, bạn sẽ cần một máy tính mới nhất như Intel Core i3 hoặc i5 với tối thiểu 2GB RAM (khuyến nghị 4GB RAM). Bạn cũng sẽ cần phần mềm sau:

  • Hệ điều hành Linux hoặc Windows 95/98/2000 / NT hoặc Windows 7.

  • Máy chủ web Apache 1.3.19-5.

  • Trình duyệt Web Internet Explorer 5.0 trở lên.

  • Ruby 1.8.5

Hướng dẫn này sẽ cung cấp các kỹ năng cần thiết để tạo GUI, mạng và ứng dụng Web bằng Ruby. Nó cũng sẽ nói về việc mở rộng và nhúng các ứng dụng Ruby.

Tiếp theo là gì?

Chương tiếp theo hướng dẫn bạn đến nơi bạn có thể lấy Ruby và tài liệu của nó. Cuối cùng, nó hướng dẫn bạn cách cài đặt Ruby và chuẩn bị môi trường để phát triển các ứng dụng Ruby.

Thiết lập môi trường cục bộ

Nếu bạn vẫn sẵn sàng thiết lập môi trường của mình cho ngôn ngữ lập trình Ruby, thì hãy tiếp tục. Hướng dẫn này sẽ dạy bạn tất cả các chủ đề quan trọng liên quan đến thiết lập môi trường. Chúng tôi khuyên bạn nên xem qua các chủ đề sau trước và sau đó tiến hành thêm -

  • Cài đặt Ruby trên Linux / Unix - Nếu bạn dự định có môi trường phát triển của mình trên Máy Linux / Unix, hãy xem qua chương này.

  • Cài đặt Ruby trên Windows - Nếu bạn dự định có môi trường phát triển của mình trên Windows Machine, hãy xem qua chương này.

  • Tùy chọn dòng lệnh của Ruby - Chương này liệt kê tất cả các tùy chọn dòng lệnh mà bạn có thể sử dụng cùng với trình thông dịch Ruby.

  • Các biến môi trường Ruby - Chương này có danh sách tất cả các biến môi trường quan trọng được thiết lập để làm cho Trình thông dịch Ruby hoạt động.

Biên tập viên Ruby nổi tiếng

Để viết các chương trình Ruby của bạn, bạn sẽ cần một trình soạn thảo -

  • Nếu bạn đang làm việc trên máy Windows, thì bạn có thể sử dụng bất kỳ trình soạn thảo văn bản đơn giản nào như Notepad hoặc Edit plus.

  • VIM (Vi IMproved) là một trình soạn thảo văn bản rất đơn giản. Điều này có sẵn trên hầu hết các máy Unix và bây giờ là Windows. Nếu không, bạn có thể sử dụng trình soạn thảo vi yêu thích của mình để viết các chương trình Ruby.

  • RubyWin là một Môi trường Phát triển Tích hợp Ruby (IDE) dành cho Windows.

  • Ruby Development Environment (RDE) cũng là một IDE rất tốt cho người dùng windows.

Ruby tương tác (IRb)

Interactive Ruby (IRb) cung cấp một trình bao để thử nghiệm. Trong IRb shell, bạn có thể xem ngay kết quả biểu thức, từng dòng một.

Công cụ này đi kèm với cài đặt Ruby nên bạn không cần làm gì thêm để IRb hoạt động.

Chỉ loại irb tại dấu nhắc lệnh của bạn và một Phiên Ruby tương tác sẽ bắt đầu như dưới đây:

$irb
irb 0.6.1(99/09/16)
irb(main):001:0> def hello
irb(main):002:1> out = "Hello World"
irb(main):003:1> puts out
irb(main):004:1> end
nil
irb(main):005:0> hello
Hello World
nil
irb(main):006:0>

Đừng lo lắng về những gì chúng tôi đã làm ở đây. Bạn sẽ học tất cả các bước này trong các chương tiếp theo.

Tiếp theo là gì?

Chúng tôi giả sử bây giờ bạn có một Môi trường Ruby đang hoạt động và bạn đã sẵn sàng để viết Chương trình Ruby đầu tiên. Chương tiếp theo sẽ hướng dẫn bạn cách viết các chương trình Ruby.

Hãy để chúng tôi viết một chương trình đơn giản bằng ruby. Tất cả các tệp ruby ​​sẽ có phần mở rộng.rb. Vì vậy, hãy đặt mã nguồn sau vào tệp test.rb.

#!/usr/bin/ruby -w

puts "Hello, Ruby!";

Ở đây, chúng tôi giả định rằng bạn có sẵn trình thông dịch Ruby trong thư mục / usr / bin. Bây giờ, hãy thử chạy chương trình này như sau:

$ ruby test.rb

Điều này sẽ tạo ra kết quả sau:

Hello, Ruby!

Bạn đã thấy một chương trình Ruby đơn giản, bây giờ chúng ta hãy xem một vài khái niệm cơ bản liên quan đến Cú pháp Ruby.

Khoảng trắng trong chương trình Ruby

Các ký tự khoảng trắng như dấu cách và tab thường bị bỏ qua trong mã Ruby, ngoại trừ khi chúng xuất hiện trong chuỗi. Tuy nhiên, đôi khi, chúng được sử dụng để giải thích các tuyên bố không rõ ràng. Việc diễn giải kiểu này tạo ra cảnh báo khi tùy chọn -w được bật.

Thí dụ

a + b is interpreted as a+b ( Here a is a local variable)
a  +b is interpreted as a(+b) ( Here a is a method call)

Kết thúc dòng trong chương trình Ruby

Ruby diễn giải các dấu chấm phẩy và các ký tự dòng mới là phần cuối của một câu lệnh. Tuy nhiên, nếu Ruby gặp các toán tử, chẳng hạn như +, - hoặc dấu gạch chéo ngược ở cuối dòng, chúng biểu thị sự tiếp tục của một câu lệnh.

Số nhận dạng Ruby

Định danh là tên của các biến, hằng số và phương thức. Các mã định danh Ruby phân biệt chữ hoa chữ thường. Nó có nghĩa là Ram và RAM là hai định danh khác nhau trong Ruby.

Tên mã định danh Ruby có thể bao gồm các ký tự chữ và số và ký tự gạch dưới (_).

Từ dành riêng

Danh sách sau đây hiển thị các từ dành riêng trong Ruby. Những từ dành riêng này không được dùng làm tên hằng hoặc tên biến. Tuy nhiên, chúng có thể được sử dụng làm tên phương thức.

BẮT ĐẦU làm kế tiếp sau đó
KẾT THÚC khác không thật
bí danh elsif không phải undef
kết thúc hoặc là trừ khi
bắt đầu đảm bảo làm lại cho đến khi
phá vỡ sai giải cứu khi nào
trường hợp cho thử lại trong khi
lớp học nếu trở về trong khi
phản đối trong bản thân __TẬP TIN__
xác định? mô-đun siêu __HÀNG__

Đây là Tài liệu trong Ruby

"Here Document" đề cập đến việc xây dựng các chuỗi từ nhiều dòng. Sau dấu <<, bạn có thể chỉ định một chuỗi hoặc một số nhận dạng để kết thúc chuỗi ký tự và tất cả các dòng theo sau dòng hiện tại cho đến dấu chấm dứt là giá trị của chuỗi.

Nếu dấu ngoặc kép được trích dẫn, loại dấu ngoặc kép sẽ xác định loại ký tự của chuỗi hướng dòng. Chú ý không được có khoảng trắng giữa << và dấu chấm hết.

Dưới đây là các ví dụ khác nhau -

#!/usr/bin/ruby -w

print <<EOF
   This is the first way of creating
   here document ie. multiple line string.
EOF

print <<"EOF";                # same as above
   This is the second way of creating
   here document ie. multiple line string.
EOF

print <<`EOC`                 # execute commands
	echo hi there
	echo lo there
EOC

print <<"foo", <<"bar"  # you can stack them
	I said foo.
foo
	I said bar.
bar

Điều này sẽ tạo ra kết quả sau:

This is the first way of creating
   her document ie. multiple line string.
   This is the second way of creating
   her document ie. multiple line string.
hi there
lo there
      I said foo.
      I said bar.

Câu lệnh Ruby BEGIN

Cú pháp

BEGIN {
   code
}

Khai báo sẽ được gọi trước khi chương trình được chạy.

Thí dụ

#!/usr/bin/ruby

puts "This is main Ruby Program"

BEGIN {
   puts "Initializing Ruby Program"
}

Điều này sẽ tạo ra kết quả sau:

Initializing Ruby Program
This is main Ruby Program

Câu lệnh Ruby END

Cú pháp

END {
   code
}

Khai báo sẽ được gọi vào cuối chương trình.

Thí dụ

#!/usr/bin/ruby

puts "This is main Ruby Program"

END {
   puts "Terminating Ruby Program"
}
BEGIN {
   puts "Initializing Ruby Program"
}

Điều này sẽ tạo ra kết quả sau:

Initializing Ruby Program
This is main Ruby Program
Terminating Ruby Program

Bình luận Ruby

Một bình luận ẩn một dòng, một phần của dòng hoặc một số dòng khỏi trình thông dịch Ruby. Bạn có thể sử dụng ký tự băm (#) ở đầu dòng -

# I am a comment. Just ignore me.

Hoặc, một nhận xét có thể nằm trên cùng một dòng sau một câu lệnh hoặc biểu thức -

name = "Madisetti" # This is again comment

Bạn có thể bình luận nhiều dòng như sau:

# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.

Đây là một hình thức khác. Nhận xét khối này ẩn một số dòng khỏi trình thông dịch với = begin / = end -

=begin
This is a comment.
This is a comment, too.
This is a comment, too.
I said that already.
=end

Ruby là một ngôn ngữ lập trình hướng đối tượng hoàn hảo. Các tính năng của ngôn ngữ lập trình hướng đối tượng bao gồm:

  • Đóng gói dữ liệu
  • Trừu tượng dữ liệu
  • Polymorphism
  • Inheritance

Các tính năng này đã được thảo luận trong chương Ruby hướng đối tượng .

Một chương trình hướng đối tượng liên quan đến các lớp và đối tượng. Một lớp là bản thiết kế mà từ đó các đối tượng riêng lẻ được tạo ra. Theo thuật ngữ hướng đối tượng, chúng tôi nói rằng xe đạp của bạn là một ví dụ của lớp đối tượng được gọi là xe đạp.

Lấy ví dụ về bất kỳ phương tiện nào. Nó bao gồm bánh xe, mã lực và dung tích bình xăng hoặc nhiên liệu. Các đặc điểm này tạo thành các thành viên dữ liệu của lớp Xe. Bạn có thể phân biệt chiếc xe này với chiếc xe khác với sự trợ giúp của những đặc điểm này.

Một chiếc xe cũng có thể có một số chức năng nhất định, chẳng hạn như dừng, lái và tăng tốc. Ngay cả các hàm này cũng tạo thành các thành viên dữ liệu của lớp Xe. Do đó, bạn có thể định nghĩa một lớp là sự kết hợp của các đặc điểm và chức năng.

Phương tiện hạng A có thể được định nghĩa là -

Class Vehicle {

   Number no_of_wheels
   Number horsepower
   Characters type_of_tank
   Number Capacity
   Function speeding {
   }
   
   Function driving {
   }
   
   Function halting {
   }
}

Bằng cách gán các giá trị khác nhau cho các thành viên dữ liệu này, bạn có thể hình thành một số trường hợp của Phương tiện lớp. Ví dụ, một chiếc máy bay có ba bánh, mã lực 1.000, nhiên liệu là loại thùng chứa và dung tích 100 lít. Tương tự như vậy, một chiếc ô tô có bốn bánh, mã lực 200, dùng xăng như loại bình, dung tích 25 lít.

Định nghĩa một lớp trong Ruby

Để thực hiện lập trình hướng đối tượng bằng cách sử dụng Ruby, trước tiên bạn cần học cách tạo các đối tượng và lớp trong Ruby.

Một lớp trong Ruby luôn bắt đầu bằng lớp từ khóa theo sau là tên của lớp. Tên phải luôn được viết hoa đầu tiên. Lớp Khách hàng có thể được hiển thị là -

class Customer
end

Bạn kết thúc một lớp bằng cách sử dụng kết thúc từ khóa . Tất cả các thành viên dữ liệu trong lớp nằm giữa định nghĩa lớp và từ khóa end .

Các biến trong một lớp Ruby

Ruby cung cấp bốn loại biến:

  • Local Variables- Biến cục bộ là những biến được định nghĩa trong một phương thức. Các biến cục bộ không có sẵn bên ngoài phương thức. Bạn sẽ xem thêm chi tiết về phương pháp trong chương tiếp theo. Các biến cục bộ bắt đầu bằng chữ thường hoặc _.

  • Instance Variables- Các biến cá thể có sẵn trên các phương thức cho bất kỳ cá thể hoặc đối tượng cụ thể nào. Điều đó có nghĩa là các biến thể hiện thay đổi từ đối tượng này sang đối tượng khác. Các biến cá thể được đặt trước bởi dấu tại (@) theo sau là tên biến.

  • Class Variables- Các biến lớp có sẵn trên các đối tượng khác nhau. Một biến lớp thuộc về lớp và là một đặc trưng của một lớp. Chúng được đặt trước bởi dấu @@ và theo sau là tên biến.

  • Global Variables- Các biến lớp không có sẵn trên các lớp. Nếu bạn muốn có một biến duy nhất, có sẵn trên các lớp, bạn cần xác định một biến toàn cục. Các biến toàn cục luôn đứng trước ký hiệu đô la ($).

Thí dụ

Sử dụng biến lớp @@ no_of_customers, bạn có thể xác định số lượng đối tượng đang được tạo. Điều này cho phép tạo ra số lượng khách hàng.

class Customer
   @@no_of_customers = 0
end

Tạo các đối tượng trong Ruby bằng phương pháp mới

Đối tượng là các thể hiện của lớp. Bây giờ bạn sẽ học cách tạo các đối tượng của một lớp trong Ruby. Bạn có thể tạo các đối tượng trong Ruby bằng cách sử dụng phương thức new của lớp.

Phương thức new là một loại phương thức duy nhất, được xác định trước trong thư viện Ruby. Phương thức mới thuộc về các phương thức lớp .

Đây là ví dụ để tạo hai đối tượng cust1 và cust2 của lớp Khách hàng -

cust1 = Customer. new
cust2 = Customer. new

Ở đây, cust1 và cust2 là tên của hai đối tượng. Bạn viết tên đối tượng theo sau là dấu bằng (=) sau đó tên lớp sẽ theo sau. Sau đó, toán tử dấu chấm và từ khóa mới sẽ theo sau.

Phương pháp tùy chỉnh để tạo các đối tượng Ruby

Bạn có thể truyền các tham số cho phương thức mới và những tham số đó có thể được sử dụng để khởi tạo các biến lớp.

Khi bạn định khai báo phương thức mới với các tham số, bạn cần phải khai báo phương thức khởi tạo tại thời điểm tạo lớp.

Các initialize phương pháp là một dạng đặc biệt của phương pháp, mà sẽ được thực hiện khi mới phương pháp của lớp được gọi với tham số.

Đây là ví dụ để tạo phương thức khởi tạo -

class Customer
   @@no_of_customers = 0
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
   end
end

Trong ví dụ này, bạn khai báo phương thức khởi tạo vớiid, nameaddrnhư các biến cục bộ. Ở đây, defend được sử dụng để định nghĩa một phương thức Ruby khởi tạo . Bạn sẽ tìm hiểu thêm về các phương pháp trong các chương tiếp theo.

Trong phương thức khởi tạo , bạn chuyển các giá trị của các biến cục bộ này cho các biến cá thể @cust_id, @cust_name và @cust_addr. Ở đây, các biến cục bộ giữ các giá trị được truyền cùng với phương thức mới.

Bây giờ, bạn có thể tạo các đối tượng như sau:

cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")

Các hàm thành viên trong Ruby Class

Trong Ruby, các hàm được gọi là các phương thức. Mỗi phương thức trong một lớp bắt đầu bằng từ khóa def theo sau là tên phương thức.

Tên phương thức luôn được ưu tiên trong lowercase letters. Bạn kết thúc một phương thức trong Ruby bằng cách sử dụng từ khóa end .

Đây là ví dụ để định nghĩa một phương thức Ruby:

class Sample
   def function
      statement 1
      statement 2
   end
end

Ở đây, câu lệnh 1câu lệnh 2 là một phần của phần thân của hàm phương thức bên trong lớp Mẫu. Các trạng thái này có thể là bất kỳ câu lệnh Ruby hợp lệ nào. Ví dụ chúng ta có thể đặt một phương pháp puts in Xin chào của Ruby như sau -

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

Bây giờ trong ví dụ sau, hãy tạo một đối tượng của lớp Mẫu và gọi phương thức hello và xem kết quả:

#!/usr/bin/ruby

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

# Now using above class to create objects
object = Sample. new
object.hello

Điều này sẽ tạo ra kết quả sau:

Hello Ruby!

Nghiên cứu điển hình đơn giản

Đây là một nghiên cứu điển hình nếu bạn muốn thực hành nhiều hơn với lớp và đối tượng.

Nghiên cứu điển hình về lớp Ruby

Các biến là vị trí bộ nhớ, chứa bất kỳ dữ liệu nào được sử dụng bởi bất kỳ chương trình nào.

Có năm loại biến được hỗ trợ bởi Ruby. Bạn cũng đã xem qua một mô tả nhỏ về các biến này trong chương trước. Năm loại biến này được giải thích trong chương này.

Biến toàn cầu của Ruby

Các biến toàn cục bắt đầu bằng $. Các biến toàn cục chưa được khởi tạo có giá trị nil và tạo ra cảnh báo với tùy chọn -w.

Việc gán cho các biến toàn cục sẽ thay đổi trạng thái toàn cục. Không nên sử dụng các biến toàn cục. Họ làm cho các chương trình khó hiểu.

Đây là một ví dụ cho thấy việc sử dụng biến toàn cục.

#!/usr/bin/ruby

$global_variable = 10 class Class1 def print_global puts "Global variable in Class1 is #$global_variable"
   end
end
class Class2
   def print_global
      puts "Global variable in Class2 is #$global_variable"
   end
end

class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global

Ở đây $ global_variable là một biến toàn cục. Điều này sẽ tạo ra kết quả sau:

NOTE - Trong Ruby, bạn CÓ THỂ truy cập giá trị của bất kỳ biến hoặc hằng nào bằng cách đặt một ký tự băm (#) ngay trước biến hoặc hằng đó.

Global variable in Class1 is 10
Global variable in Class2 is 10

Biến phiên bản Ruby

Các biến phiên bản bắt đầu bằng @. Các biến phiên bản chưa được khởi tạo có giá trị nil và tạo ra cảnh báo với tùy chọn -w.

Dưới đây là một ví dụ cho thấy việc sử dụng Biến phiên bản.

#!/usr/bin/ruby

class Customer
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
   end
end

# Create Objects
cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.display_details()
cust2.display_details()

Ở đây, @cust_id, @cust_name và @cust_addr là các biến cá thể. Điều này sẽ tạo ra kết quả sau:

Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala

Biến lớp Ruby

Các biến lớp bắt đầu bằng @@ và phải được khởi tạo trước khi chúng có thể được sử dụng trong các định nghĩa phương thức.

Tham chiếu đến một biến lớp chưa được khởi tạo sẽ tạo ra lỗi. Các biến lớp được chia sẻ giữa các con của lớp hoặc mô-đun mà các biến lớp được định nghĩa.

Ghi đè các biến lớp tạo ra cảnh báo với tùy chọn -w.

Đây là một ví dụ cho thấy việc sử dụng biến lớp:

#!/usr/bin/ruby

class Customer
   @@no_of_customers = 0
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
   end
   def total_no_of_customers()
      @@no_of_customers += 1
      puts "Total number of customers: #@@no_of_customers"
   end
end

# Create Objects
cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.total_no_of_customers()
cust2.total_no_of_customers()

Ở đây @@ no_of_customers là một biến lớp. Điều này sẽ tạo ra kết quả sau:

Total number of customers: 1
Total number of customers: 2

Biến cục bộ Ruby

Các biến cục bộ bắt đầu bằng chữ thường hoặc _. Phạm vi của một biến cục bộ nằm trong khoảng từ lớp, mô-đun, def hoặc do đến phần cuối tương ứng hoặc từ dấu ngoặc nhọn mở của một khối đến dấu ngoặc nhọn {}.

Khi một biến cục bộ chưa được khởi tạo được tham chiếu, nó được hiểu là một lời gọi đến một phương thức không có đối số.

Việc gán cho các biến cục bộ chưa được khởi tạo cũng dùng như khai báo biến. Các biến bắt đầu tồn tại cho đến khi đạt đến cuối phạm vi hiện tại. Thời gian tồn tại của các biến cục bộ được xác định khi Ruby phân tích chương trình.

Trong ví dụ trên, các biến cục bộ là id, name và addr.

Hằng số Ruby

Hằng số bắt đầu bằng một chữ cái viết hoa. Các hằng số được xác định trong một lớp hoặc mô-đun có thể được truy cập từ bên trong lớp hoặc mô-đun đó và những hằng số được xác định bên ngoài một lớp hoặc mô-đun có thể được truy cập trên toàn cầu.

Hằng số có thể không được xác định trong các phương thức. Tham chiếu đến một hằng số chưa được khởi tạo sẽ tạo ra lỗi. Việc gán một hằng số đã được khởi tạo sẽ tạo ra một cảnh báo.

#!/usr/bin/ruby

class Example
   VAR1 = 100
   VAR2 = 200
   def show
      puts "Value of first Constant is #{VAR1}"
      puts "Value of second Constant is #{VAR2}"
   end
end

# Create Objects
object = Example.new()
object.show

Ở đây VAR1 và VAR2 là các hằng số. Điều này sẽ tạo ra kết quả sau:

Value of first Constant is 100
Value of second Constant is 200

Biến giả Ruby

Chúng là những biến đặc biệt có sự xuất hiện của biến cục bộ nhưng hoạt động giống như hằng số. Bạn không thể gán bất kỳ giá trị nào cho các biến này.

  • self - Đối tượng nhận của phương thức hiện tại.

  • true - Giá trị đại diện cho sự thật.

  • false - Giá trị đại diện sai.

  • nil - Giá trị đại diện cho không xác định.

  • __FILE__ - Tên của tệp nguồn hiện tại.

  • __LINE__ - Số dòng hiện tại trong tệp nguồn.

Ruby Basic Literals

Các quy tắc Ruby sử dụng cho các chữ rất đơn giản và trực quan. Phần này giải thích tất cả các Ruby Literal cơ bản.

Số nguyên

Ruby hỗ trợ số nguyên. Một số nguyên có thể nằm trong khoảng từ -2 30 đến 2 30-1 hoặc -2 62 đến 2 62-1 . Các số nguyên trong phạm vi này là các đối tượng của lớp Fixnum và các số nguyên bên ngoài phạm vi này được lưu trữ trong các đối tượng của lớp Bignum .

Bạn viết các số nguyên bằng cách sử dụng dấu đầu tùy chọn, một chỉ báo cơ sở tùy chọn (0 cho hệ bát phân, 0x cho hex hoặc 0b cho hệ nhị phân), theo sau là một chuỗi các chữ số trong cơ số thích hợp. Các ký tự gạch dưới được bỏ qua trong chuỗi chữ số.

Bạn cũng có thể lấy giá trị số nguyên, tương ứng với một ký tự ASCII hoặc thoát khỏi chuỗi bằng cách đặt trước nó bằng dấu chấm hỏi.

Thí dụ

123                  # Fixnum decimal
1_234                # Fixnum decimal with underline
-500                 # Negative Fixnum
0377                 # octal
0xff                 # hexadecimal
0b1011               # binary
?a                   # character code for 'a'
?\n                  # code for a newline (0x0a)
12345678901234567890 # Bignum

NOTE - Lớp và Đối tượng được giải thích trong một chương riêng của hướng dẫn này.

Số nổi

Ruby hỗ trợ số nổi. Chúng cũng là số nhưng với số thập phân. Số dấu phẩy động là đối tượng của lớp Float và có thể là bất kỳ đối tượng nào sau đây:

Thí dụ

123.4                # floating point value
1.0e6                # scientific notation
4E20                 # dot not required
4e+20                # sign before exponential

Chuỗi chữ

Chuỗi Ruby chỉ đơn giản là chuỗi byte 8 bit và chúng là đối tượng của chuỗi lớp. Các chuỗi được trích dẫn kép cho phép thay thế và ký hiệu dấu gạch chéo ngược nhưng các chuỗi được trích dẫn đơn không cho phép thay thế và chỉ cho phép ký hiệu dấu gạch chéo ngược đối với \\ và \ '

Thí dụ

#!/usr/bin/ruby -w

puts 'escape using "\\"';
puts 'That\'s right';

Điều này sẽ tạo ra kết quả sau:

escape using "\"
That's right

Bạn có thể thay thế giá trị của bất kỳ biểu thức Ruby nào thành một chuỗi bằng cách sử dụng chuỗi #{ expr }. Ở đây, expr có thể là bất kỳ biểu thức ruby ​​nào.

#!/usr/bin/ruby -w

puts "Multiplication Value : #{24*60*60}";

Điều này sẽ tạo ra kết quả sau:

Multiplication Value : 86400

Ký hiệu gạch chéo ngược

Sau đây là danh sách các ký hiệu Backslash được hỗ trợ bởi Ruby:

Ký hiệu Ký tự đại diện
\ n Dòng mới (0x0a)
\ r Vận chuyển trở lại (0x0d)
\ f Nguồn cấp dữ liệu định dạng (0x0c)
\ b Backspace (0x08)
\ a Chuông (0x07)
\ e Thoát (0x1b)
\S Không gian (0x20)
\ nnn Ký hiệu bát phân (n là 0-7)
\ xnn Ký hiệu thập lục phân (n là 0-9, af hoặc AF)
\ cx, \ Cx Control-x
\ Mx Meta-x (c | 0x80)
\ M- \ Cx Meta-Control-x
\ x Nhân vật x

Để biết thêm chi tiết về Chuỗi Ruby, hãy xem qua Chuỗi Ruby .

Mảng Ruby

Chữ viết của Ruby Array được tạo bằng cách đặt một loạt các tham chiếu đối tượng được phân tách bằng dấu phẩy giữa các dấu ngoặc vuông. Dấu phẩy ở cuối bị bỏ qua.

Thí dụ

#!/usr/bin/ruby

ary = [  "fred", 10, 3.14, "This is a string", "last element", ]
ary.each do |i|
   puts i
end

Điều này sẽ tạo ra kết quả sau:

fred
10
3.14
This is a string
last element

Để biết thêm chi tiết về Mảng Ruby, hãy xem Mảng Ruby .

Ruby Hashes

Một Ruby Hash theo nghĩa đen được tạo ra bằng cách đặt một danh sách các cặp khóa / giá trị giữa các dấu ngoặc nhọn, với dấu phẩy hoặc chuỗi => giữa khóa và giá trị. Dấu phẩy ở cuối bị bỏ qua.

Thí dụ

#!/usr/bin/ruby

hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each do |key, value|
   print key, " is ", value, "\n"
end

Điều này sẽ tạo ra kết quả sau:

red is 3840
green is 240
blue is 15

Để biết thêm chi tiết về Ruby Hashes, hãy xem qua Ruby Hashes .

Dãy Ruby

Phạm vi đại diện cho một khoảng là một tập hợp các giá trị có bắt đầu và kết thúc. Phạm vi có thể được xây dựng bằng cách sử dụng các ký tự s..e và s ... e hoặc với Range.new.

Phạm vi được xây dựng bằng cách sử dụng .. chạy từ đầu đến cuối hoàn toàn. Những người được tạo bằng cách sử dụng ... loại trừ giá trị cuối cùng. Khi được sử dụng như một trình lặp, các dải ô trả về từng giá trị trong chuỗi.

Phạm vi (1..5) có nghĩa là nó bao gồm 1, 2, 3, 4, 5 giá trị và phạm vi (1 ... 5) có nghĩa là nó bao gồm 1, 2, 3, 4 giá trị.

Thí dụ

#!/usr/bin/ruby

(10..15).each do |n| 
   print n, ' ' 
end

Điều này sẽ tạo ra kết quả sau:

10 11 12 13 14 15

Để biết thêm chi tiết về Ruby Ranges, hãy xem qua Ruby Ranges .

Ruby hỗ trợ một tập hợp các toán tử phong phú, như bạn mong đợi từ một ngôn ngữ hiện đại. Hầu hết các nhà khai thác thực sự là các cuộc gọi phương thức. Ví dụ, a + b được hiểu là a. + (B), trong đó phương thức + trong đối tượng được tham chiếu bởi biến a được gọi với b là đối số của nó.

Đối với mỗi toán tử (+ - * /% ** & | ^ << >> && ||), có một dạng toán tử gán viết tắt tương ứng (+ = - =, v.v.).

Toán tử số học Ruby

Giả sử biến a giữ 10 và biến b giữ 20, thì -

Nhà điều hành Sự miêu tả Thí dụ
+ Phép cộng - Thêm giá trị vào hai bên của toán tử. a + b sẽ cho 30
- Phép trừ - Trừ toán hạng bên phải khỏi toán hạng bên trái. a - b sẽ cho -10
* Phép nhân - Nhân các giá trị ở hai bên của toán tử. a * b sẽ cho 200
/ Phép chia - Chia toán hạng bên trái cho toán hạng bên phải. b / a sẽ cho 2
% Modulus - Chia toán hạng bên trái cho toán hạng bên phải và trả về phần dư. b% a sẽ cho 0
** Exponent - Thực hiện phép tính lũy thừa (lũy thừa) trên các toán tử. a ** b sẽ cho 10 lũy thừa 20

Toán tử so sánh Ruby

Giả sử biến a giữ 10 và biến b giữ 20, thì -

Nhà điều hành Sự miêu tả Thí dụ
== Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu có thì điều kiện trở thành true. (a == b) không đúng.
! = Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu các giá trị không bằng nhau thì điều kiện trở thành true. (a! = b) là đúng.
> Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (a> b) không đúng.
< Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (a <b) là đúng.
> = Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (a> = b) không đúng.
<= Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (a <= b) là đúng.
<=> Toán tử so sánh kết hợp. Trả về 0 nếu toán hạng đầu tiên bằng thứ hai, 1 nếu toán hạng đầu tiên lớn hơn toán hạng thứ hai và -1 nếu toán hạng đầu tiên nhỏ hơn toán hạng thứ hai. (a <=> b) trả về -1.
=== Được sử dụng để kiểm tra sự bình đẳng trong mệnh đề when của một câu lệnh trường hợp . (1 ... 10) === 5 trả về true.
.eql? Đúng nếu bộ nhận và đối số có cùng kiểu và giá trị bằng nhau. 1 == 1.0 trả về true, nhưng 1.eql? (1.0) là false.
công bằng? Đúng nếu bộ nhận và đối số có cùng id đối tượng. nếu aObj là bản sao của bObj thì aObj == bObj là đúng, a.equal? ​​bObj là sai nhưng a.equal? ​​aObj là đúng.

Các toán tử chuyển nhượng Ruby

Giả sử biến a giữ 10 và biến b giữ 20, thì -

Nhà điều hành Sự miêu tả Thí dụ
= Toán tử gán đơn giản, gán giá trị từ toán hạng bên phải sang toán hạng bên trái. c = a + b sẽ gán giá trị của a + b vào c
+ = Thêm toán tử gán AND, thêm toán hạng bên phải vào toán hạng bên trái và gán kết quả cho toán hạng bên trái. c + = a tương đương với c = c + a
- = Trừ toán tử gán AND, trừ toán hạng bên phải khỏi toán hạng bên trái và gán kết quả cho toán hạng bên trái. c - = a tương đương với c = c - a
* = Nhân toán tử gán AND, nhân toán hạng phải với toán hạng bên trái và gán kết quả cho toán hạng trái. c * = a tương đương với c = c * a
/ = Toán tử gán AND, chia toán hạng bên trái với toán hạng bên phải và gán kết quả cho toán hạng bên trái. c / = a tương đương với c = c / a
% = Toán tử gán mô-đun AND, nhận mô-đun sử dụng hai toán hạng và gán kết quả cho toán hạng bên trái. c% = a tương đương với c = c% a
** = Toán tử gán số mũ AND, thực hiện phép tính lũy thừa (lũy thừa) trên các toán tử và gán giá trị cho toán hạng bên trái. c ** = a tương đương với c = c ** a

Chuyển nhượng song song Ruby

Ruby cũng hỗ trợ việc gán song song các biến. Điều này cho phép nhiều biến được khởi tạo bằng một dòng mã Ruby. Ví dụ -

a = 10
b = 20
c = 30

Điều này có thể được khai báo nhanh hơn bằng cách sử dụng phép gán song song -

a, b, c = 10, 20, 30

Phép gán song song cũng hữu ích để hoán đổi các giá trị được giữ trong hai biến -

a, b = b, c

Toán tử Ruby Bitwise

Toán tử bitwise hoạt động trên các bit và thực hiện thao tác từng bit.

Giả sử nếu a = 60; và b = 13; bây giờ ở định dạng nhị phân, chúng sẽ như sau:

a    =  0011 1100
 b    =  0000 1101
 ------------------
 a&b  =  0000 1100
 a|b  =  0011 1101
 a^b  =  0011 0001
 ~a   =  1100 0011

Các toán tử Bitwise sau đây được hỗ trợ bởi ngôn ngữ Ruby.

Nhà điều hành Sự miêu tả Thí dụ
& Toán tử AND nhị phân sao chép một bit vào kết quả nếu nó tồn tại trong cả hai toán hạng. (a & b) sẽ cho kết quả là 12, là 0000 1100
| Toán tử OR nhị phân sao chép một bit nếu nó tồn tại trong một trong hai toán hạng. (a | b) sẽ cho 61, là 0011 1101
^ Toán tử XOR nhị phân sao chép bit nếu nó được đặt trong một toán hạng nhưng không phải cả hai. (a ^ b) sẽ cho 49, là 0011 0001
~ Toán tử bổ sung số nhị phân là một ngôi và có tác dụng 'lật' các bit. (~ a) sẽ cho -61, là 1100 0011 ở dạng phần bù của 2 do một số nhị phân có dấu.
<< Toán tử dịch chuyển trái nhị phân. Giá trị toán hạng bên trái được di chuyển sang trái bằng số bit được chỉ định bởi toán hạng bên phải. a << 2 sẽ cho 240, là 1111 0000
>> Toán tử Shift phải nhị phân. Giá trị của toán hạng bên trái được di chuyển sang phải bằng số bit được chỉ định bởi toán hạng bên phải. a >> 2 sẽ cho 15, là 0000 1111

Toán tử logic Ruby

Các toán tử logic sau được ngôn ngữ Ruby hỗ trợ

Giả sử biến a giữ 10 và biến b giữ 20, thì -

Nhà điều hành Sự miêu tả Thí dụ
Được gọi là toán tử logic AND. Nếu cả hai toán hạng đều đúng, thì điều kiện trở thành đúng. (a và b) là đúng.
hoặc là Được gọi là Toán tử logic HOẶC. Nếu bất kỳ toán hạng nào trong hai toán hạng khác 0, thì điều kiện trở thành true. (a hoặc b) là đúng.
&& Được gọi là toán tử logic AND. Nếu cả hai toán hạng đều khác 0, thì điều kiện trở thành true. (a && b) là đúng.
|| Được gọi là Toán tử logic HOẶC. Nếu bất kỳ toán hạng nào trong hai toán hạng khác 0, thì điều kiện trở thành true. (a || b) là đúng.
! Được gọi là Toán tử logic NOT. Sử dụng để đảo ngược trạng thái logic của toán hạng của nó. Nếu một điều kiện là đúng, thì toán tử logic NOT sẽ sai. ! (a && b) là sai.
không phải Được gọi là Toán tử logic NOT. Sử dụng để đảo ngược trạng thái logic của toán hạng của nó. Nếu một điều kiện là đúng, thì toán tử logic NOT sẽ sai. not (a && b) là false.

Nhà điều hành Ruby Ternary

Có một toán tử nữa được gọi là Toán tử bậc ba. Đầu tiên, nó đánh giá một biểu thức cho một giá trị đúng hoặc sai và sau đó thực hiện một trong hai câu lệnh đã cho tùy thuộc vào kết quả đánh giá. Toán tử điều kiện có cú pháp này:

Nhà điều hành Sự miêu tả Thí dụ
? : Biểu thức điều kiện Nếu Điều kiện là đúng? Sau đó giá trị X: Ngược lại giá trị Y

Toán tử Ruby Range

Phạm vi trình tự trong Ruby được sử dụng để tạo một phạm vi giá trị liên tiếp - bao gồm giá trị bắt đầu, giá trị kết thúc và một phạm vi giá trị ở giữa.

Trong Ruby, các chuỗi này được tạo bằng cách sử dụng các toán tử phạm vi ".." và "...". Biểu mẫu hai chấm tạo ra một phạm vi bao gồm, trong khi biểu mẫu ba chấm tạo ra một phạm vi loại trừ giá trị cao được chỉ định.

Nhà điều hành Sự miêu tả Thí dụ
.. Tạo một phạm vi bao gồm từ điểm bắt đầu đến điểm cuối. 1..10 Tạo phạm vi bao gồm từ 1 đến 10.
... Tạo một phạm vi từ điểm xuất phát đến điểm cuối độc quyền. 1 ... 10 Tạo phạm vi từ 1 đến 9.

Ruby được định nghĩa? Các nhà khai thác

xác định? là một toán tử đặc biệt có dạng một lời gọi phương thức để xác định xem biểu thức truyền vào có được xác định hay không. Nó trả về một chuỗi mô tả của biểu thức hoặc nil nếu biểu thức không được xác định.

Có nhiều cách sử dụng xác định? Nhà điều hành

Cách sử dụng 1

defined? variable # True if variable is initialized

For Example

foo = 42
defined? foo    # => "local-variable"
defined? $_     # => "global-variable"
defined? bar    # => nil (undefined)

Cách sử dụng 2

defined? method_call # True if a method is defined

For Example

defined? puts        # => "method"
defined? puts(bar)   # => nil (bar is not defined here)
defined? unpack      # => nil (not defined here)

Cách sử dụng 3

# True if a method exists that can be called with super user
defined? super

For Example

defined? super     # => "super" (if it can be called)
defined? super     # => nil (if it cannot be)

Cách sử dụng 4

defined? yield   # True if a code block has been passed

For Example

defined? yield    # => "yield" (if there is a block passed)
defined? yield    # => nil (if there is no block)

Dấu chấm Ruby "." và Dấu hai chấm "::" Toán tử

Bạn gọi một phương thức mô-đun bằng cách đặt trước tên của nó với tên của mô-đun và một dấu chấm, và bạn tham chiếu một hằng số bằng cách sử dụng tên mô-đun và hai dấu hai chấm.

Các :: là toán tử một ngôi cho phép: hằng số, phương thức thể hiện và phương thức lớp được định nghĩa trong một lớp hoặc mô-đun, được truy cập từ bất kỳ đâu bên ngoài lớp hoặc mô-đun.

Remember trong Ruby, các lớp và phương thức cũng có thể được coi là hằng số.

Bạn chỉ cần thêm tiền tố :: Const_name với một biểu thức trả về lớp hoặc đối tượng mô-đun thích hợp.

Nếu không có biểu thức tiền tố nào được sử dụng, lớp Đối tượng chính được sử dụng theo mặc định.

Đây là hai ví dụ -

MR_COUNT = 0         # constant defined on main Object class
module Foo
   MR_COUNT = 0
   ::MR_COUNT = 1    # set global count to 1
   MR_COUNT = 2      # set local count to 2
end
puts MR_COUNT        # this is the global constant
puts Foo::MR_COUNT   # this is the local "Foo" constant

Second Example

CONST = ' out there'
class Inside_one
   CONST = proc {' in there'}
   def where_is_my_CONST
      ::CONST + ' inside one'
   end
end
class Inside_two
   CONST = ' inside two'
   def where_is_my_CONST
      CONST
   end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST

Ưu tiên các nhà khai thác Ruby

Bảng sau liệt kê tất cả các toán tử từ ưu tiên cao nhất đến thấp nhất.

phương pháp Nhà điều hành Sự miêu tả
Đúng :: Toán tử độ phân giải không đổi
Đúng [] [] = Tham chiếu phần tử, tập hợp phần tử
Đúng ** Luỹ thừa (nâng lên lũy thừa)
Đúng ! ~ + - Không, phần bù, cộng và trừ một bậc (tên phương thức cho hai phần cuối là + @ và - @)
Đúng * /% Nhân, chia và modulo
Đúng + - Cộng và trừ
Đúng >> << Dịch chuyển theo chiều bit phải và trái
Đúng & Bitwise 'VÀ'
Đúng ^ | Bitwise độc ​​quyền 'OR' và thông thường 'OR'
Đúng <= <>> = Toán tử so sánh
Đúng <=> == ===! = = ~! ~ Các toán tử so khớp bình đẳng và mẫu (! = Và! ~ Có thể không được định nghĩa là phương thức)
  && Hợp lý 'VÀ'
  || Logic 'HOẶC'
  .. ... Phạm vi (bao gồm và độc quyền)
  ? : Bậc ba nếu-thì-khác
  =% = {/ = - = + = | = & = >> = << = * = && = || = ** = Chuyển nhượng
  xác định? Kiểm tra xem đã xác định ký hiệu được chỉ định chưa
  không phải Phủ định lôgic
  hoặc và Thành phần logic

NOTE- Các toán tử có dấu trong cột phương thức thực sự là các phương thức và như vậy có thể bị ghi đè.

Nhận xét là các dòng chú thích trong mã Ruby bị bỏ qua trong thời gian chạy. Một dòng chú thích bắt đầu bằng ký tự # và chúng kéo dài từ # đến cuối dòng như sau:

#!/usr/bin/ruby -w
# This is a single line comment.

puts "Hello, Ruby!"

Khi được thực thi, chương trình trên tạo ra kết quả sau:

Hello, Ruby!

Nhận xét về Ruby Multiline

Bạn có thể bình luận nhiều dòng bằng cách sử dụng =begin=end cú pháp như sau -

#!/usr/bin/ruby -w

puts "Hello, Ruby!"

=begin
This is a multiline comment and con spwan as many lines as you
like. But =begin and =end should come in the first line only. 
=end

Khi được thực thi, chương trình trên tạo ra kết quả sau:

Hello, Ruby!

Đảm bảo rằng các nhận xét sau đó đủ xa với mã và chúng dễ dàng phân biệt. Nếu có nhiều hơn một nhận xét ở cuối trong một khối, hãy căn chỉnh chúng. Ví dụ -

@counter      # keeps track times page has been hit
@siteCounter  # keeps track of times all pages have been hit

Ruby cung cấp các cấu trúc có điều kiện khá phổ biến đối với các ngôn ngữ hiện đại. Ở đây, chúng tôi sẽ giải thích tất cả các câu lệnh điều kiện và bổ ngữ có sẵn trong Ruby.

Câu lệnh Ruby if ... else

Cú pháp

if conditional [then]
   code...
[elsif conditional [then]
   code...]...
[else
   code...]
end

nếu biểu thức được sử dụng để thực hiện có điều kiện. Các giá trị falsenil là false và mọi thứ khác đều đúng. Lưu ý Ruby sử dụng elsif, không phải else if nor elif.

Thực thi nếu điều kiện là đúng. Nếu điều kiện không đúng, được chỉ định trong mệnh đề else sẽ được thực thi.

Điều kiện của biểu thức if được phân tách khỏi mã bằng từ dành riêng sau đó , một dòng mới hoặc dấu chấm phẩy.

Thí dụ

#!/usr/bin/ruby

x = 1
if x > 2
   puts "x is greater than 2"
elsif x <= 2 and x!=0
   puts "x is 1"
else
   puts "I can't guess the number"
end
x is 1

Ruby if sửa đổi

Cú pháp

code if condition

Thực thi nếu điều kiện là đúng.

Thí dụ

#!/usr/bin/ruby

$debug = 1
print "debug\n" if $debug

Điều này sẽ tạo ra kết quả sau:

debug

Ruby trừ khi Tuyên bố

Cú pháp

unless conditional [then]
   code
[else
   code ]
end

Thực thi nếu điều kiện là sai. Nếu điều kiện là đúng, mã được chỉ định trong mệnh đề else sẽ được thực thi.

Thí dụ

#!/usr/bin/ruby

x = 1 
unless x>=2
   puts "x is less than 2"
 else
   puts "x is greater than 2"
end

Điều này sẽ tạo ra kết quả sau:

x is less than 2

Ruby trừ khi sửa đổi

Cú pháp

code unless conditional

Thực thi nếu điều kiện là sai.

Thí dụ

#!/usr/bin/ruby

$var =  1
print "1 -- Value is set\n" if $var print "2 -- Value is set\n" unless $var

$var = false print "3 -- Value is set\n" unless $var

Điều này sẽ tạo ra kết quả sau:

1 -- Value is set
3 -- Value is set

Tuyên bố trường hợp Ruby

Cú pháp

case expression
[when expression [, expression ...] [then]
   code ]...
[else
   code ]
end

So sánh biểu thức được chỉ định theo trường hợp và biểu thức được chỉ định bởi khi sử dụng toán tử === và thực thi của mệnh đề when phù hợp.

Các biểu hiện theo quy định của mệnh đề khi được đánh giá là các toán hạng bên trái. Nếu không khi các mệnh đề khớp nhau, trường hợp thực thi mã của mệnh đề else .

Một khi biểu hiện tuyên bố của được tách ra từ mã bởi các từ dành riêng sau đó, một dòng mới, hoặc một dấu chấm phẩy. Như vậy -

case expr0
when expr1, expr2
   stmt1
when expr3, expr4
   stmt2
else
   stmt3
end

về cơ bản tương tự như sau:

_tmp = expr0
if expr1 === _tmp || expr2 === _tmp
   stmt1
elsif expr3 === _tmp || expr4 === _tmp
   stmt2
else
   stmt3
end

Thí dụ

#!/usr/bin/ruby

$age = 5 case $age
when 0 .. 2
   puts "baby"
when 3 .. 6
   puts "little child"
when 7 .. 12
   puts "child"
when 13 .. 18
   puts "youth"
else
   puts "adult"
end

Điều này sẽ tạo ra kết quả sau:

little child

Các vòng lặp trong Ruby được sử dụng để thực thi cùng một khối mã với một số lần xác định. Chương này trình bày chi tiết tất cả các câu lệnh lặp được Ruby hỗ trợ.

Câu lệnh Ruby while

Cú pháp

while conditional [do]
   code
end

Thực thi trong khi điều kiện là đúng. Một khi vòng lặp của điều kiện được tách ra từ đang bởi từ dành riêng làm, một dòng mới, dấu chéo ngược \, hoặc một dấu chấm phẩy;.

Thí dụ

#!/usr/bin/ruby

$i = 0
$num = 5

while $i < $num  do
   puts("Inside the loop i = #$i" )
   $i +=1
end

Điều này sẽ tạo ra kết quả sau:

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4

Công cụ sửa đổi Ruby while

Cú pháp

code while condition

OR

begin 
  code 
end while conditional

Thực thi trong khi điều kiện là đúng.

Nếu một sửa đổi while theo sau câu lệnh bắt đầu không có mệnh đề cứu hoặc đảm bảo, được thực thi một lần trước khi điều kiện được đánh giá.

Thí dụ

#!/usr/bin/ruby

$i = 0
$num = 5
begin
   puts("Inside the loop i = #$i" )
   $i +=1
end while $i < $num

Điều này sẽ tạo ra kết quả sau:

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4

Ruby cho đến khi Tuyên bố

until conditional [do]
   code
end

Thực thi trong khi điều kiện là sai. Một cho đến khi có điều kiện tuyên bố được tách biệt đang được từ dành riêng làm , một dòng mới, hoặc một dấu chấm phẩy.

Thí dụ

#!/usr/bin/ruby

$i = 0
$num = 5

until $i > $num  do
   puts("Inside the loop i = #$i" )
   $i +=1;
end

Điều này sẽ tạo ra kết quả sau:

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4
Inside the loop i = 5

Ruby cho đến khi sửa đổi

Cú pháp

code until conditional

OR

begin
   code
end until conditional

Thực thi trong khi điều kiện là sai.

Nếu một bổ ngữ cho đến sau câu lệnh bắt đầu không có mệnh đề cứu hoặc đảm bảo, được thực thi một lần trước khi điều kiện được đánh giá.

Thí dụ

#!/usr/bin/ruby

$i = 0
$num = 5
begin
   puts("Inside the loop i = #$i" )
   $i +=1;
end until $i > $num

Điều này sẽ tạo ra kết quả sau:

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4
Inside the loop i = 5

Ruby cho Tuyên bố

Cú pháp

for variable [, variable ...] in expression [do]
   code
end

Thực thi một lần cho mỗi phần tử trong biểu thức .

Thí dụ

#!/usr/bin/ruby

for i in 0..5
   puts "Value of local variable is #{i}"
end

Ở đây, chúng tôi đã xác định phạm vi 0..5. Câu lệnh cho i trong 0..5 sẽ cho phép tôi nhận các giá trị trong phạm vi từ 0 đến 5 (bao gồm cả 5). Điều này sẽ tạo ra kết quả sau:

Value of local variable is 0
Value of local variable is 1
Value of local variable is 2
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Một cho ... trong vòng lặp là gần như chính xác tương đương với những điều sau đây -

(expression).each do |variable[, variable...]| code end

ngoại trừ việc vòng lặp for không tạo phạm vi mới cho các biến cục bộ. Một cho vòng lặp của biểu được tách ra từ đang bởi từ dành riêng làm, một dòng mới, hoặc một dấu chấm phẩy.

Thí dụ

#!/usr/bin/ruby

(0..5).each do |i|
   puts "Value of local variable is #{i}"
end

Điều này sẽ tạo ra kết quả sau:

Value of local variable is 0
Value of local variable is 1
Value of local variable is 2
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Tuyên bố phá vỡ Ruby

Cú pháp

break

Chấm dứt vòng lặp nội bộ nhất. Kết thúc một phương thức với một khối được liên kết nếu được gọi trong khối (với phương thức trả về nil).

Thí dụ

#!/usr/bin/ruby

for i in 0..5
   if i > 2 then
      break
   end
   puts "Value of local variable is #{i}"
end

Điều này sẽ tạo ra kết quả sau:

Value of local variable is 0
Value of local variable is 1
Value of local variable is 2

Câu lệnh tiếp theo của Ruby

Cú pháp

next

Chuyển đến lần lặp tiếp theo của vòng lặp nội bộ nhất. Kết thúc việc thực thi một khối nếu được gọi trong một khối (với kết quả hoặc cuộc gọi trả về nil).

Thí dụ

#!/usr/bin/ruby

for i in 0..5
   if i < 2 then
      next
   end
   puts "Value of local variable is #{i}"
end

Điều này sẽ tạo ra kết quả sau:

Value of local variable is 2
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Ruby redo Statement

Cú pháp

redo

Khởi động lại lần lặp này của vòng lặp nội bộ nhất mà không cần kiểm tra điều kiện của vòng lặp. Khởi động lại năng suất hoặc cuộc gọi nếu được gọi trong một khối.

Thí dụ

#!/usr/bin/ruby

for i in 0..5
   if i < 2 then
      puts "Value of local variable is #{i}"
      redo
   end
end

Điều này sẽ tạo ra kết quả sau và sẽ đi theo một vòng lặp vô hạn:

Value of local variable is 0
Value of local variable is 0
............................

Câu lệnh thử lại của Ruby

Cú pháp

retry

Nếu thử lại xuất hiện trong mệnh đề cứu của biểu thức begin, hãy khởi động lại từ phần đầu của phần begin.

begin
   do_something # exception raised
rescue
   # handles error
   retry  # restart from beginning
end

Nếu thử lại xuất hiện trong trình lặp, khối hoặc nội dung của biểu thức for , hãy khởi động lại lệnh gọi trình lặp. Các đối số đến trình lặp được đánh giá lại.

for i in 1..5
   retry if some_condition # restart from i == 1
end

Thí dụ

#!/usr/bin/ruby
for i in 0..5
   retry if i > 2
puts "Value of local variable is #{i}"
end

Điều này sẽ tạo ra kết quả sau và sẽ đi theo một vòng lặp vô hạn:

Value of local variable is 1
Value of local variable is 2
Value of local variable is 1
Value of local variable is 2
Value of local variable is 1
Value of local variable is 2
............................

Các phương thức của Ruby rất giống với các hàm trong bất kỳ ngôn ngữ lập trình nào khác. Các phương thức Ruby được sử dụng để gói một hoặc nhiều câu lệnh lặp lại thành một đơn vị duy nhất.

Tên phương thức phải bắt đầu bằng một chữ cái thường. Nếu bạn bắt đầu một tên phương thức bằng chữ hoa, Ruby có thể nghĩ rằng nó là một hằng số và do đó có thể phân tích cú pháp cuộc gọi không chính xác.

Các phương thức nên được xác định trước khi gọi chúng, nếu không Ruby sẽ đưa ra một ngoại lệ cho việc gọi phương thức không xác định.

Cú pháp

def method_name [( [arg [= default]]...[, * arg [, &expr ]])]
   expr..
end

Vì vậy, bạn có thể xác định một phương pháp đơn giản như sau:

def method_name 
   expr..
end

Bạn có thể biểu diễn một phương thức chấp nhận các tham số như thế này -

def method_name (var1, var2)
   expr..
end

Bạn có thể đặt giá trị mặc định cho các tham số, sẽ được sử dụng nếu phương thức được gọi mà không chuyển các tham số bắt buộc -

def method_name (var1 = value1, var2 = value2)
   expr..
end

Bất cứ khi nào bạn gọi phương thức đơn giản, bạn chỉ viết tên phương thức như sau:

method_name

Tuy nhiên, khi bạn gọi một phương thức với các tham số, bạn viết tên phương thức cùng với các tham số, chẳng hạn như -

method_name 25, 30

Hạn chế quan trọng nhất khi sử dụng các phương thức có tham số là bạn cần phải nhớ số lượng tham số bất cứ khi nào bạn gọi các phương thức như vậy. Ví dụ, nếu một phương thức chấp nhận ba tham số và bạn chỉ truyền hai tham số, thì Ruby sẽ hiển thị lỗi.

Thí dụ

#!/usr/bin/ruby

def test(a1 = "Ruby", a2 = "Perl")
   puts "The programming language is #{a1}"
   puts "The programming language is #{a2}"
end
test "C", "C++"
test

Điều này sẽ tạo ra kết quả sau:

The programming language is C
The programming language is C++
The programming language is Ruby
The programming language is Perl

Trả lại giá trị từ các phương thức

Mọi phương thức trong Ruby đều trả về một giá trị theo mặc định. Giá trị trả về này sẽ là giá trị của câu lệnh cuối cùng. Ví dụ -

def test
   i = 100
   j = 10
   k = 0
end

Phương thức này khi được gọi sẽ trả về biến k được khai báo cuối cùng .

Câu lệnh trả về Ruby

Câu lệnh return trong ruby ​​được sử dụng để trả về một hoặc nhiều giá trị từ một Phương thức Ruby.

Cú pháp

return [expr[`,' expr...]]

Nếu có nhiều hơn hai biểu thức, mảng chứa các giá trị này sẽ là giá trị trả về. Nếu không có biểu thức nào được đưa ra, nil sẽ là giá trị trả về.

Thí dụ

return

OR

return 12

OR

return 1,2,3

Hãy xem ví dụ này -

#!/usr/bin/ruby

def test
   i = 100
   j = 200
   k = 300
return i, j, k
end
var = test
puts var

Điều này sẽ tạo ra kết quả sau:

100
200
300

Số biến các tham số

Giả sử bạn khai báo một phương thức nhận hai tham số, bất cứ khi nào bạn gọi phương thức này, bạn cần truyền hai tham số cùng với nó.

Tuy nhiên, Ruby cho phép bạn khai báo các phương thức hoạt động với một số lượng tham số thay đổi. Hãy để chúng tôi kiểm tra một mẫu của điều này -

#!/usr/bin/ruby

def sample (*test)
   puts "The number of parameters is #{test.length}"
   for i in 0...test.length
      puts "The parameters are #{test[i]}"
   end
end
sample "Zara", "6", "F"
sample "Mac", "36", "M", "MCA"

Trong mã này, bạn đã khai báo một mẫu phương thức chấp nhận một kiểm tra tham số. Tuy nhiên, tham số này là một tham số biến. Điều này có nghĩa là tham số này có thể nhận bất kỳ số lượng biến nào. Vì vậy, đoạn mã trên sẽ tạo ra kết quả sau:

The number of parameters is 3
The parameters are Zara
The parameters are 6
The parameters are F
The number of parameters is 4
The parameters are Mac
The parameters are 36
The parameters are M
The parameters are MCA

Phương pháp lớp học

Khi một phương thức được định nghĩa bên ngoài định nghĩa lớp, phương thức đó được đánh dấu là private theo mặc định. Mặt khác, các phương thức được định nghĩa trong định nghĩa lớp được đánh dấu là công khai theo mặc định. Khả năng hiển thị mặc định và nhãn hiệu riêng của các phương thức có thể được thay đổi theo công khai hoặc riêng tư của Mô-đun.

Bất cứ khi nào bạn muốn truy cập một phương thức của một lớp, trước tiên bạn cần khởi tạo lớp đó. Sau đó, bằng cách sử dụng đối tượng, bạn có thể truy cập bất kỳ thành viên nào của lớp.

Ruby cung cấp cho bạn một cách để truy cập một phương thức mà không cần khởi tạo một lớp. Hãy để chúng tôi xem cách một phương thức lớp được khai báo và truy cập -

class Accounts
   def reading_charge
   end
   def Accounts.return_date
   end
end

Xem phương thức return_date được khai báo như thế nào. Nó được khai báo với tên lớp theo sau là dấu chấm, theo sau là tên của phương thức. Bạn có thể truy cập phương thức lớp này trực tiếp như sau:

Accounts.return_date

Để truy cập phương thức này, bạn không cần tạo các đối tượng của các Tài khoản lớp.

Tuyên bố bí danh Ruby

Điều này cung cấp bí danh cho các phương thức hoặc biến toàn cục. Không thể xác định bí danh trong phần thân phương thức. Bí danh của phương thức giữ nguyên định nghĩa hiện tại của phương thức, ngay cả khi các phương thức bị ghi đè.

Việc tạo bí danh cho các biến toàn cục được đánh số ($ 1, $ 2, ...) bị cấm. Ghi đè các biến toàn cục được tích hợp sẵn có thể gây ra các vấn đề nghiêm trọng.

Cú pháp

alias method-name method-name
alias global-variable-name global-variable-name

Thí dụ

alias foo bar
alias $MATCH $&

Ở đây chúng tôi đã xác định bí danh foo cho bar và $ MATCH là bí danh cho $ &

Câu lệnh Ruby undef

Điều này hủy bỏ định nghĩa phương pháp. Một undef không thể xuất hiện trong thân phương thức.

Bằng cách sử dụng undefalias , giao diện của lớp có thể được sửa đổi độc lập với lớp cha, nhưng lưu ý rằng nó có thể bị phá vỡ các chương trình bởi lời gọi phương thức nội bộ.

Cú pháp

undef method-name

Thí dụ

Để hủy xác định một phương thức có tên là bar, hãy làm như sau:

undef bar

Bạn đã thấy cách Ruby định nghĩa các phương thức mà bạn có thể đặt số lượng câu lệnh và sau đó bạn gọi phương thức đó. Tương tự, Ruby có một khái niệm về Block.

  • Một khối bao gồm các đoạn mã.

  • Bạn gán tên cho một khối.

  • Mã trong khối luôn được đặt trong dấu ngoặc nhọn ({}).

  • Một khối luôn được gọi từ một hàm có cùng tên với tên của khối. Điều này có nghĩa là nếu bạn có một khối với kiểm tra tên , thì bạn sử dụng kiểm tra hàm để gọi khối này.

  • Bạn gọi một khối bằng cách sử dụng câu lệnh lợi nhuận .

Cú pháp

block_name {
   statement1
   statement2
   ..........
}

Ở đây, bạn sẽ học cách gọi một khối bằng cách sử dụng một câu lệnh lợi nhuận đơn giản . Bạn cũng sẽ học cách sử dụng câu lệnh lợi nhuận với các tham số để gọi một khối. Bạn sẽ kiểm tra mã mẫu với cả hai loại báo cáo lợi nhuận .

Báo cáo lợi nhuận

Hãy xem một ví dụ về báo cáo lợi nhuận -

#!/usr/bin/ruby

def test
   puts "You are in the method"
   yield
   puts "You are again back to the method"
   yield
end
test {puts "You are in the block"}

Điều này sẽ tạo ra kết quả sau:

You are in the method
You are in the block
You are again back to the method
You are in the block

Bạn cũng có thể chuyển các tham số bằng câu lệnh lợi nhuận. Đây là một ví dụ -

#!/usr/bin/ruby

def test
   yield 5
   puts "You are in the method test"
   yield 100
end
test {|i| puts "You are in the block #{i}"}

Điều này sẽ tạo ra kết quả sau:

You are in the block 5
You are in the method test
You are in the block 100

Ở đây, câu lệnh lợi nhuận được viết theo sau là các tham số. Bạn thậm chí có thể truyền nhiều hơn một tham số. Trong khối, bạn đặt một biến giữa hai đường thẳng đứng (||) để chấp nhận các tham số. Do đó, trong đoạn mã trước, câu lệnh lợi nhuận 5 chuyển giá trị 5 làm tham số cho khối kiểm tra.

Bây giờ, hãy xem câu lệnh sau:

test {|i| puts "You are in the block #{i}"}

Ở đây, giá trị 5 được nhận trong biến i . Bây giờ, hãy quan sát câu lệnh put sau :

puts "You are in the block #{i}"

Đầu ra của câu lệnh put này là:

You are in the block 5

Nếu bạn muốn truyền nhiều hơn một tham số, thì câu lệnh lợi nhuận sẽ trở thành:

yield a, b

và khối là -

test {|a, b| statement}

Các tham số sẽ được phân tách bằng dấu phẩy.

Các khối và phương pháp

Bạn đã thấy cách một khối và một phương thức có thể liên kết với nhau. Bạn thường gọi một khối bằng cách sử dụng câu lệnh lợi nhuận từ một phương thức có cùng tên với tên của khối. Do đó, bạn viết -

#!/usr/bin/ruby

def test
   yield
end
test{ puts "Hello world"}

Ví dụ này là cách đơn giản nhất để triển khai một khối. Bạn gọi khối kiểm tra bằng cách sử dụng câu lệnh lợi nhuận .

Nhưng nếu đối số cuối cùng của một phương thức đứng trước &, thì bạn có thể truyền một khối cho phương thức này và khối này sẽ được gán cho tham số cuối cùng. Trong trường hợp cả * và & đều có trong danh sách đối số, & sẽ xuất hiện sau.

#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}

Điều này sẽ tạo ra kết quả sau:

Hello World!

Khối BEGIN và END

Mọi tệp nguồn Ruby đều có thể khai báo các khối mã để chạy khi tệp đang được tải (các khối BEGIN) và sau khi chương trình kết thúc quá trình thực thi (các khối END).

#!/usr/bin/ruby

BEGIN { 
   # BEGIN block code 
   puts "BEGIN code block"
} 

END { 
   # END block code 
   puts "END code block"
}
   # MAIN block code 
puts "MAIN code block"

Một chương trình có thể bao gồm nhiều khối BEGIN và END. Các khối BEGIN được thực thi theo thứ tự mà chúng gặp phải. Các khối END được thực hiện theo thứ tự ngược lại. Khi được thực thi, chương trình trên tạo ra kết quả sau:

BEGIN code block
MAIN code block
END code block

Mô-đun là một cách nhóm các phương thức, lớp và hằng số lại với nhau. Mô-đun mang lại cho bạn hai lợi ích chính.

  • Mô-đun cung cấp một không gian tên và ngăn chặn xung đột tên.

  • Các mô-đun thực hiện cơ sở mixin .

Các mô-đun xác định một không gian tên, một hộp cát trong đó các phương thức và hằng số của bạn có thể chơi mà không phải lo lắng về việc bị các phương thức và hằng số khác dẫm lên.

Cú pháp

module Identifier
   statement1
   statement2
   ...........
end

Hằng số mô-đun được đặt tên giống như hằng số lớp, với một ký tự viết hoa đầu tiên. Các định nghĩa phương thức trông cũng tương tự: Các phương thức mô-đun được định nghĩa giống như các phương thức lớp.

Như với các phương thức lớp, bạn gọi một phương thức mô-đun bằng cách đặt trước tên của nó bằng tên mô-đun và một dấu chấm, và bạn tham chiếu đến một hằng số bằng cách sử dụng tên mô-đun và hai dấu hai chấm.

Thí dụ

#!/usr/bin/ruby

# Module defined in trig.rb file

module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

Chúng ta có thể xác định thêm một mô-đun có cùng tên chức năng nhưng khác chức năng -

#!/usr/bin/ruby

# Module defined in moral.rb file

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

Giống như các phương thức lớp, bất cứ khi nào bạn xác định một phương thức trong một mô-đun, bạn chỉ định tên mô-đun, theo sau là dấu chấm và sau đó là tên phương thức.

Ruby yêu cầu Tuyên bố

Câu lệnh request tương tự như câu lệnh include của C và C ++ và câu lệnh import của Java. Nếu một chương trình thứ ba muốn sử dụng bất kỳ thành phần định nghĩa, nó chỉ đơn giản có thể tải các tập tin mô-đun sử dụng Ruby yêu cầu tuyên bố -

Cú pháp

require filename

Ở đây, không bắt buộc phải đưa .rb phần mở rộng cùng với tên tệp.

Thí dụ

$LOAD_PATH << '.'

require 'trig.rb'
require 'moral'

y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)

Ở đây chúng tôi đang sử dụng $LOAD_PATH << '.'để cho Ruby biết rằng các tệp bao gồm phải được tìm kiếm trong thư mục hiện tại. Nếu bạn không muốn sử dụng $ LOAD_PATH thì bạn có thể sử dụngrequire_relative để bao gồm các tệp từ một thư mục tương đối.

IMPORTANT- Ở đây, cả hai tệp chứa cùng một tên hàm. Vì vậy, điều này sẽ dẫn đến sự mơ hồ của mã khi bao gồm trong chương trình đang gọi nhưng các mô-đun tránh được sự mơ hồ của mã này và chúng ta có thể gọi hàm thích hợp bằng cách sử dụng tên mô-đun.

Câu lệnh bao gồm Ruby

Bạn có thể nhúng một mô-đun vào một lớp. Để nhúng một mô-đun vào một lớp, bạn sử dụng câu lệnh include trong lớp:

Cú pháp

include modulename

Nếu một module được định nghĩa trong một file riêng biệt, sau đó nó là cần thiết để bao gồm rằng tập tin sử dụng yêu cầu tuyên bố trước khi nhúng mô-đun trong một lớp học.

Thí dụ

Hãy xem xét mô-đun sau được viết trong tệp support.rb .

module Week
   FIRST_DAY = "Sunday"
   def Week.weeks_in_month
      puts "You have four weeks in a month"
   end
   def Week.weeks_in_year
      puts "You have 52 weeks in a year"
   end
end

Bây giờ, bạn có thể bao gồm mô-đun này trong một lớp như sau:

#!/usr/bin/ruby
$LOAD_PATH << '.'
require "support"

class Decade
include Week
   no_of_yrs = 10
   def no_of_months
      puts Week::FIRST_DAY
      number = 10*12
      puts number
   end
end
d1 = Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months

Điều này sẽ tạo ra kết quả sau:

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Mixin trong Ruby

Trước khi xem qua phần này, chúng tôi cho rằng bạn đã có kiến ​​thức về các khái niệm hướng đối tượng.

Khi một lớp có thể kế thừa các tính năng từ nhiều hơn một lớp cha, thì lớp đó phải hiển thị đa kế thừa.

Ruby không hỗ trợ đa kế thừa trực tiếp nhưng Ruby Modules có một công dụng tuyệt vời khác. Khi đột quỵ, họ loại bỏ khá nhiều nhu cầu về đa kế thừa, cung cấp một cơ sở gọi là mixin .

Mixins cung cấp cho bạn một cách kiểm soát tuyệt vời để thêm chức năng vào các lớp. Tuy nhiên, sức mạnh thực sự của chúng xuất hiện khi mã trong mixin bắt đầu tương tác với mã trong lớp sử dụng nó.

Hãy để chúng tôi kiểm tra mã mẫu sau để hiểu rõ về mixin:

module A
   def a1
   end
   def a2
   end
end
module B
   def b1
   end
   def b2
   end
end

class Sample
include A
include B
   def s1
   end
end

samp = Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

Mô-đun A bao gồm các phương pháp a1 và a2. Mô-đun B bao gồm các phương pháp b1 và b2. Lớp Sample bao gồm cả hai mô-đun A và B. Lớp Sample có thể truy cập tất cả bốn phương thức, cụ thể là a1, a2, b1 và b2. Do đó, bạn có thể thấy rằng lớp Sample kế thừa từ cả hai mô-đun. Vì vậy, bạn có thể nói lớp Sample hiển thị đa kế thừa hoặc một mixin .

Một đối tượng String trong Ruby giữ và thao tác một chuỗi tùy ý của một hoặc nhiều byte, thường đại diện cho các ký tự đại diện cho ngôn ngữ của con người.

Các ký tự chuỗi đơn giản nhất được đặt trong dấu nháy đơn (ký tự dấu nháy đơn). Văn bản trong dấu ngoặc kép là giá trị của chuỗi -

'This is a simple Ruby string literal'

Nếu bạn cần đặt dấu nháy đơn trong một chuỗi ký tự được trích dẫn đơn, hãy đặt trước nó bằng dấu gạch chéo ngược để trình thông dịch Ruby không nghĩ rằng nó kết thúc chuỗi -

'Won\'t you read O\'Reilly\'s book?'

Dấu gạch chéo ngược cũng hoạt động để thoát khỏi một dấu gạch chéo ngược khác, do đó, dấu gạch chéo ngược thứ hai tự nó không được hiểu là một ký tự thoát.

Sau đây là các tính năng liên quan đến chuỗi của Ruby.

Thay thế Biểu thức

Thay thế biểu thức là một phương tiện nhúng giá trị của bất kỳ biểu thức Ruby nào vào một chuỗi bằng cách sử dụng # {và} -

#!/usr/bin/ruby

x, y, z = 12, 36, 72
puts "The value of x is #{ x }."
puts "The sum of x and y is #{ x + y }."
puts "The average was #{ (x + y + z)/3 }."

Điều này sẽ tạo ra kết quả sau:

The value of x is 12.
The sum of x and y is 48.
The average was 40.

Chuỗi phân cách chung

Với các chuỗi được phân cách chung, bạn có thể tạo các chuỗi bên trong một cặp ký tự phân tách tùy ý, ví dụ:!, (, {, <, V.v., đứng trước ký tự phần trăm (%). Q, q và x có ý nghĩa đặc biệt Các chuỗi phân cách chung có thể là -

%{Ruby is fun.}  equivalent to "Ruby is fun."
%Q{ Ruby is fun. } equivalent to " Ruby is fun. "
%q[Ruby is fun.]  equivalent to a single-quoted string
%x!ls! equivalent to back tick command output `ls`

Nhân vật thoát

NOTE- Trong một chuỗi được trích dẫn kép, một ký tự thoát được diễn giải; trong một chuỗi được trích dẫn đơn, một ký tự thoát được giữ nguyên.

Ký hiệu gạch chéo ngược Ký tự thập lục phân Sự miêu tả
\ a 0x07 Chuông hoặc cảnh báo
\ b 0x08 Backspace
\ cx   Control-x
\ Cx   Control-x
\ e 0x1b Bỏ trốn
\ f 0x0c Thức ăn dạng
\ M- \ Cx   Meta-Control-x
\ n 0x0a Dòng mới
\ nnn   Ký hiệu bát phân, trong đó n nằm trong phạm vi 0,7
\ r 0x0d Vận chuyển trở lại
\S 0x20 Không gian
\ t 0x09 Chuyển hướng
\ v 0x0b Tab dọc
\ x   Nhân vật x
\ xnn   Ký hiệu thập lục phân, trong đó n nằm trong phạm vi 0,9, af hoặc AF

Mã hóa ký tự

Bộ ký tự mặc định cho Ruby là ASCII, các ký tự của chúng có thể được biểu diễn bằng các byte đơn. Nếu bạn sử dụng UTF-8 hoặc một bộ ký tự hiện đại khác, các ký tự có thể được biểu diễn bằng một đến bốn byte.

Bạn có thể thay đổi bộ ký tự của mình bằng cách sử dụng $ KCODE khi bắt đầu chương trình, như thế này -

$KCODE = 'u'
Sr.No. Mã & Mô tả
1

a

ASCII (giống như không có). Đây là mặc định.

2

e

EUC.

3

n

Không có (giống như ASCII).

4

u

UTF-8.

Phương thức tích hợp chuỗi

Chúng ta cần có một thể hiện của đối tượng String để gọi một phương thức String. Sau đây là cách tạo một thể hiện của đối tượng String:

new [String.new(str = "")]

Điều này sẽ trả về một đối tượng chuỗi mới có chứa một bản sao của str . Bây giờ, bằng cách sử dụng đối tượng str , tất cả chúng ta có thể sử dụng bất kỳ phương thức cá thể nào có sẵn. Ví dụ -

#!/usr/bin/ruby

myStr = String.new("THIS IS TEST")
foo = myStr.downcase

puts "#{foo}"

Điều này sẽ tạo ra kết quả sau:

this is test
Sr.No. Phương pháp & Mô tả
1

str % arg

Định dạng một chuỗi bằng cách sử dụng đặc tả định dạng. arg phải là một mảng nếu nó chứa nhiều hơn một thay thế. Để biết thông tin về đặc tả định dạng, hãy xem sprintf trong "Mô-đun nhân".

2

str * integer

Trả về một chuỗi mới chứa số nguyên lần str. Nói cách khác, str là số nguyên lặp lại imes.

3

str + other_str

Nối other_str với str.

4

str << obj

Nối một đối tượng với str. Nếu đối tượng là Fixnum trong phạm vi 0,255, nó được chuyển đổi thành ký tự. So sánh nó với concat.

5

str <=> other_str

So sánh str với other_str, trả về -1 (nhỏ hơn), 0 (bằng) hoặc 1 (lớn hơn). So sánh có phân biệt chữ hoa chữ thường.

6

str == obj

Kiểm tra str và obj cho bằng nhau. Nếu obj không phải là một Chuỗi, trả về false; trả về true nếu str <=> obj trả về 0.

7

str =~ obj

Đối sánh str với một đối tượng mẫu biểu thức chính quy. Trả về vị trí bắt đầu trận đấu; ngược lại, sai.

số 8

str.capitalize

Viết hoa một chuỗi.

9

str.capitalize!

Giống như viết hoa, nhưng các thay đổi được thực hiện tại chỗ.

10

str.casecmp

So sánh các chuỗi không phân biệt chữ hoa chữ thường.

11

str.center

Căn giữa một chuỗi.

12

str.chomp

Loại bỏ dấu phân tách bản ghi ($ /), thường là \ n, khỏi phần cuối của một chuỗi. Nếu không có dấu tách bản ghi tồn tại, không có gì.

13

str.chomp!

Giống như chomp, nhưng các thay đổi được thực hiện tại chỗ.

14

str.chop

Loại bỏ ký tự cuối cùng trong str.

15

str.chop!

Tương tự như chop, nhưng các thay đổi được thực hiện tại chỗ.

16

str.concat(other_str)

Nối other_str với str.

17

str.count(str, ...)

Đếm một hoặc nhiều bộ ký tự. Nếu có nhiều hơn một bộ ký tự, hãy đếm giao của các bộ đó

18

str.crypt(other_str)

Áp dụng hàm băm mật mã một chiều cho str. Đối số là chuỗi muối, phải dài hai ký tự, mỗi ký tự trong phạm vi az, AZ, 0,9 ,. hoặc là /.

19

str.delete(other_str, ...)

Trả về một bản sao của str với tất cả các ký tự trong giao điểm của các đối số của nó đã bị xóa.

20

str.delete!(other_str, ...)

Tương tự như xóa, nhưng các thay đổi được thực hiện tại chỗ.

21

str.downcase

Trả về một bản sao của str với tất cả các chữ hoa được thay thế bằng chữ thường.

22

str.downcase!

Giống như chữ thường, nhưng các thay đổi được thực hiện tại chỗ.

23

str.dump

Trả về phiên bản str với tất cả các ký tự không in được thay thế bằng ký hiệu \ nnn và tất cả các ký tự đặc biệt đều thoát.

24

str.each(separator = $/) { |substr| block }

Tách str bằng cách sử dụng đối số làm dấu phân tách bản ghi ($ / theo mặc định), chuyển từng chuỗi con đến khối được cung cấp.

25

str.each_byte { |fixnum| block }

Truyền từng byte từ str vào khối, trả về mỗi byte dưới dạng biểu diễn thập phân của byte.

26

str.each_line(separator=$/) { |substr| block }

Tách str bằng cách sử dụng đối số làm dấu phân tách bản ghi ($ / theo mặc định), chuyển từng chuỗi con đến khối được cung cấp.

27

str.empty?

Trả về true nếu str trống (có độ dài bằng 0).

28

str.eql?(other)

Hai chuỗi bằng nhau nếu chúng có cùng độ dài và nội dung.

29

str.gsub(pattern, replacement) [or]

str.gsub(pattern) { |match| block }

Trả về một bản sao của str với tất cả các lần xuất hiện của mẫu được thay thế bằng thay thế hoặc giá trị của khối. Mẫu thường sẽ là Regexp; nếu nó là một Chuỗi thì sẽ không có ký tự siêu biểu thức chính quy nào được hiểu (nghĩa là / \ d / sẽ khớp với một chữ số, nhưng '\ d' sẽ khớp với một dấu gạch chéo ngược theo sau là 'd')

30

str[fixnum] [or] str[fixnum,fixnum] [or] str[range] [or] str[regexp] [or] str[regexp, fixnum] [or] str[other_str]

Tham chiếu str, sử dụng các đối số sau: one Fixnum, trả về mã ký tự tại fixnum; hai Fixnums, trả về một chuỗi con bắt đầu tại một điểm bù (fixnum đầu tiên) đến độ dài (fixnum thứ hai); dải ô, trả về một chuỗi con trong dải ô; regexp trả về một phần của chuỗi đã so khớp; regexp với fixnum, trả về dữ liệu phù hợp tại fixnum; other_str trả về chuỗi con phù hợp với other_str. Một Fixnum phủ định bắt đầu ở cuối chuỗi với -1.

31

str[fixnum] = fixnum [or] str[fixnum] = new_str [or] str[fixnum, fixnum] = new_str [or] str[range] = aString [or] str[regexp] = new_str [or] str[regexp, fixnum] = new_str [or] str[other_str] = new_str ]

Thay thế (gán) tất cả hoặc một phần của chuỗi. Từ đồng nghĩa của slice !.

32

str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match|block }

Thực hiện các thay thế của Chuỗi # gsub tại chỗ, trả về str hoặc nil nếu không có thay thế nào được thực hiện.

33

str.hash

Trả về một hàm băm dựa trên độ dài và nội dung của chuỗi.

34

str.hex

Xử lý các ký tự đứng đầu từ str dưới dạng một chuỗi các chữ số thập lục phân (với dấu tùy chọn và 0x tùy chọn) và trả về số tương ứng. Số không được trả về do lỗi.

35

str.include? other_str [or] str.include? fixnum

Trả về true nếu str chứa chuỗi hoặc ký tự đã cho.

36

str.index(substring [, offset]) [or]

str.index(fixnum [, offset]) [or]

str.index(regexp [, offset])

Trả về chỉ số của lần xuất hiện đầu tiên của chuỗi con, ký tự (fixnum) hoặc mẫu (regexp) đã cho trong str. Trả về nil nếu không tìm thấy. Nếu tham số thứ hai hiện diện, nó chỉ định vị trí trong chuỗi để bắt đầu tìm kiếm.

37

str.insert(index, other_str)

Chèn other_str trước ký tự tại chỉ mục đã cho, sửa đổi str. Các chỉ số âm tính từ cuối chuỗi và chèn sau ký tự đã cho. Mục đích là để chèn một chuỗi để nó bắt đầu ở chỉ mục đã cho.

38

str.inspect

Trả về phiên bản str có thể in được với các ký tự đặc biệt được thoát ra.

39

str.intern [or] str.to_sym

Trả về Biểu tượng tương ứng với str, tạo biểu tượng nếu nó không tồn tại trước đó.

40

str.length

Trả về độ dài của str. So sánh kích thước.

41

str.ljust(integer, padstr = ' ')

Nếu số nguyên lớn hơn độ dài của str, trả về một chuỗi mới có độ dài số nguyên với str căn trái và được đệm bằng padstr; nếu không, trả về str.

42

str.lstrip

Trả về một bản sao của str đã xóa bỏ khoảng trắng ở đầu.

43

str.lstrip!

Loại bỏ khoảng trắng ở đầu khỏi str, trả về nil nếu không có thay đổi nào được thực hiện.

44

str.match(pattern)

Chuyển đổi mẫu thành Regexp (nếu nó chưa phải là một), sau đó gọi phương thức so khớp của nó trên str.

45

str.oct

Xử lý các ký tự đứng đầu của str dưới dạng một chuỗi các chữ số bát phân (với một dấu tùy chọn) và trả về số tương ứng. Trả về 0 nếu chuyển đổi không thành công.

46

str.replace(other_str)

Thay thế nội dung và độ bẩn của str bằng các giá trị tương ứng trong other_str.

47

str.reverse

Trả về một chuỗi mới với các ký tự từ str theo thứ tự ngược lại.

48

str.reverse!

Đảo ngược str tại chỗ.

49

str.rindex(substring [, fixnum]) [or]

str.rindex(fixnum [, fixnum]) [or]

str.rindex(regexp [, fixnum])

Trả về chỉ số của lần xuất hiện cuối cùng của chuỗi con, ký tự (fixnum) hoặc mẫu (regexp) đã cho trong str. Trả về nil nếu không tìm thấy. Nếu tham số thứ hai xuất hiện, nó chỉ định vị trí trong chuỗi để kết thúc tìm kiếm. Các ký tự ngoài điểm này sẽ không được xem xét.

50.

str.rjust(integer, padstr = ' ')

Nếu số nguyên lớn hơn độ dài của str, trả về một chuỗi mới có độ dài số nguyên với str căn phải và được đệm bằng padstr; nếu không, trả về str.

51

str.rstrip

Trả về một bản sao của str đã xóa bỏ khoảng trắng ở cuối.

52

str.rstrip!

Loại bỏ khoảng trắng ở cuối khỏi str, trả về nil nếu không có thay đổi nào được thực hiện.

53

str.scan(pattern) [or]

str.scan(pattern) { |match, ...| block }

Cả hai biểu mẫu đều lặp lại qua str, khớp với mẫu (có thể là một Regexp hoặc một Chuỗi). Đối với mỗi trận đấu, một kết quả được tạo và được thêm vào mảng kết quả hoặc được chuyển vào khối. Nếu mẫu không chứa nhóm, mỗi kết quả riêng lẻ bao gồm chuỗi phù hợp, $ &. Nếu mẫu chứa các nhóm, thì mỗi kết quả riêng lẻ là một mảng chứa một mục nhập cho mỗi nhóm.

54

str.slice(fixnum) [or] str.slice(fixnum, fixnum) [or]

str.slice(range) [or] str.slice(regexp) [or]

str.slice(regexp, fixnum) [or] str.slice(other_str)

See str[fixnum], etc.

str.slice!(fixnum) [or] str.slice!(fixnum, fixnum) [or]

str.slice!(range) [or] str.slice!(regexp) [or]

str.slice!(other_str)

Xóa phần được chỉ định khỏi str và trả về phần đã xóa. Các biểu mẫu sử dụng Fixnum sẽ tăng IndexError nếu giá trị nằm ngoài phạm vi; biểu mẫu Phạm vi sẽ tạo ra một lỗi RangeError và các biểu mẫu Regexp và Chuỗi sẽ im lặng bỏ qua việc gán.

55

str.split(pattern = $, [limit])

Chia str thành các chuỗi con dựa trên dấu phân cách, trả về một mảng các chuỗi con này.

Nếu mẫu là một Chuỗi, thì nội dung của nó được sử dụng làm dấu phân cách khi tách str. Nếu mẫu là một khoảng trắng duy nhất, str được phân chia trên khoảng trắng, với khoảng trắng ở đầu và các ký tự khoảng trắng liền nhau bị bỏ qua.

Nếu mẫu là một Regexp, str sẽ được chia khi mẫu khớp với nhau. Bất cứ khi nào mẫu khớp với một chuỗi có độ dài bằng 0, str được chia thành các ký tự riêng lẻ.

Nếu mẫu bị bỏ qua, giá trị của$; is used. If $; là nil (là mặc định), str được chia trên khoảng trắng như thể `` được chỉ định.

Nếu tham số giới hạn bị bỏ qua, các trường rỗng ở cuối sẽ bị loại bỏ. Nếu giới hạn là một số dương, thì tối đa số trường đó sẽ được trả về (nếu giới hạn là 1, toàn bộ chuỗi được trả về dưới dạng mục nhập duy nhất trong một mảng). Nếu là số âm, không có giới hạn nào đối với số trường được trả về và các trường rỗng ở cuối không bị loại bỏ.

56

str.squeeze([other_str]*)

Tạo một tập hợp các ký tự từ (các) tham số other_str bằng cách sử dụng quy trình được mô tả cho String # count. Trả về một chuỗi mới trong đó các lần chạy của cùng một ký tự xảy ra trong tập hợp này được thay thế bằng một ký tự. Nếu không có đối số nào được đưa ra, tất cả các chuỗi ký tự giống nhau sẽ được thay thế bằng một ký tự duy nhất.

57

str.squeeze!([other_str]*)

Bóp str tại chỗ, trả về str hoặc nil nếu không có thay đổi nào được thực hiện.

58

str.strip

Trả về bản sao của str đã xóa bỏ khoảng trắng ở đầu và cuối.

59

str.strip!

Loại bỏ khoảng trắng đầu và cuối khỏi str. Trả về nil nếu str không bị thay đổi.

60

str.sub(pattern, replacement) [or]

str.sub(pattern) { |match| block }

Trả về bản sao của str với lần xuất hiện đầu tiên của mẫu được thay thế bằng giá trị thay thế hoặc giá trị của khối. Mẫu thường sẽ là Regexp; nếu nó là một Chuỗi thì không có siêu ký tự biểu thức chính quy nào sẽ được diễn giải.

61

str.sub!(pattern, replacement) [or]

str.sub!(pattern) { |match| block }

Thực hiện thay thế String # sub tại chỗ, trả về str hoặc nil nếu không có thay thế nào được thực hiện.

62

str.succ [or] str.next

Trả về giá trị kế thừa cho str.

63

str.succ! [or] str.next!

Tương đương với Chuỗi # succ, nhưng sửa đổi bộ thu tại chỗ.

64

str.sum(n = 16)

Trả về tổng kiểm tra n-bit cơ bản của các ký tự trong str, trong đó n là tham số Fixnum tùy chọn, mặc định là 16. Kết quả chỉ đơn giản là tổng giá trị nhị phân của mỗi ký tự trong str modulo 2n - 1. Đây không phải là đặc biệt tổng kiểm tra tốt.

65

str.swapcase

Trả về bản sao của str với các ký tự chữ cái viết hoa được chuyển đổi thành chữ thường và các ký tự chữ thường được chuyển đổi thành chữ hoa.

66

str.swapcase!

Tương đương với String # swapcase, nhưng sửa đổi bộ thu tại chỗ, trả về str hoặc nil nếu không có thay đổi nào được thực hiện.

67

str.to_f

> Trả về kết quả diễn giải các ký tự đứng đầu trong str dưới dạng số dấu phẩy động. Các ký tự không liên quan ở cuối một số hợp lệ sẽ bị bỏ qua. Nếu không có một số hợp lệ nào ở đầu str, thì 0.0 được trả về. Phương pháp này không bao giờ nêu ra một ngoại lệ.

68

str.to_i(base = 10)

Trả về kết quả của việc diễn giải các ký tự đứng đầu trong str dưới dạng cơ số nguyên (cơ số 2, 8, 10 hoặc 16). Các ký tự không liên quan ở cuối một số hợp lệ sẽ bị bỏ qua. Nếu không có một số hợp lệ ở đầu str, 0 được trả về. Phương pháp này không bao giờ nêu ra một ngoại lệ.

69

str.to_s [or] str.to_str

Trả lại người nhận.

70

str.tr(from_str, to_str)

Trả về bản sao của str với các ký tự trong from_str được thay thế bằng các ký tự tương ứng trong to_str. Nếu to_str ngắn hơn from_str, nó sẽ được đệm bằng ký tự cuối cùng. Cả hai chuỗi đều có thể sử dụng ký hiệu c1.c2 để biểu thị phạm vi ký tự và from_str có thể bắt đầu bằng dấu ^, biểu thị tất cả các ký tự ngoại trừ những ký tự được liệt kê.

71

str.tr!(from_str, to_str)

Dịch str tại chỗ, sử dụng các quy tắc tương tự như String # tr. Trả về str hoặc nil nếu không có thay đổi nào được thực hiện.

72

str.tr_s(from_str, to_str)

Xử lý một bản sao của str như được mô tả trong Chuỗi # tr, sau đó xóa các ký tự trùng lặp trong các vùng bị ảnh hưởng bởi bản dịch.

73

str.tr_s!(from_str, to_str)

Thực hiện xử lý Chuỗi # tr_s trên str tại chỗ, trả về str hoặc nil nếu không có thay đổi nào được thực hiện.

74

str.unpack(format)

> Giải mã str (có thể chứa dữ liệu nhị phân) theo chuỗi định dạng, trả về một mảng của mỗi giá trị được trích xuất. Chuỗi định dạng bao gồm một chuỗi các lệnh đơn ký tự, được tóm tắt trong Bảng 18. Mỗi lệnh có thể được theo sau bởi một số, cho biết số lần lặp lại với lệnh này. Dấu hoa thị (*) sẽ sử dụng hết các phần tử còn lại. Mỗi chỉ thị sSiIlL có thể được theo sau bởi dấu gạch dưới (_) để sử dụng kích thước gốc của nền tảng cơ bản cho loại được chỉ định; nếu không, nó sử dụng kích thước nhất quán độc lập với nền tảng. Dấu cách bị bỏ qua trong chuỗi định dạng.

75

str.upcase

Trả về bản sao của str với tất cả các chữ cái thường được thay thế bằng các chữ cái viết hoa của chúng. Thao tác không nhạy với ngôn ngữ. Chỉ các ký tự từ a đến z bị ảnh hưởng.

76

str.upcase!

Thay đổi nội dung của str thành chữ hoa, trả về nil nếu không có thay đổi nào được thực hiện.

77

str.upto(other_str) { |s| block }

Lặp lại các giá trị kế tiếp nhau, bắt đầu từ str và kết thúc tại other_str inclusive, lần lượt chuyển từng giá trị vào khối. Phương thức String # succ được sử dụng để tạo từng giá trị.

String unpack Directives

Chỉ thị Lợi nhuận Sự miêu tả
A Chuỗi Loại bỏ các giá trị null ở cuối và dấu cách.
a Chuỗi Chuỗi.
B Chuỗi Trích xuất các bit từ mỗi ký tự (bit quan trọng nhất đầu tiên).
b Chuỗi Trích xuất các bit từ mỗi ký tự (bit ít quan trọng nhất đầu tiên).
C Fixnum Trích xuất một ký tự dưới dạng số nguyên không dấu.
c Fixnum Trích xuất một ký tự dưới dạng số nguyên.
D, d Phao nổi Xử lý các ký tự sizeof (kép) như một ký tự kép.
E Phao nổi Xử lý các ký tự sizeof (kép) là một ký tự kép theo thứ tự byte nhỏ.
e Phao nổi Xử lý các ký tự sizeof (float) như một float theo thứ tự byte nhỏ.
F, f Phao nổi Xử lý các ký tự sizeof (float) như một float gốc.
G Phao nổi Xử lý các ký tự sizeof (kép) như một ký tự kép theo thứ tự byte mạng.
g Chuỗi Xử lý các ký tự sizeof (float) như một float theo thứ tự byte mạng.
H Chuỗi Trích xuất các nibbles hex từ mỗi ký tự (bit quan trọng nhất đầu tiên)
h Chuỗi Trích xuất các nibbles hex từ mỗi ký tự (bit ít quan trọng nhất đầu tiên).
Tôi Số nguyên Xử lý các ký tự kế tiếp sizeof (int) (được sửa đổi bởi _) là một số nguyên gốc không dấu.
Tôi Số nguyên Xử lý các ký tự kế tiếp sizeof (int) (được sửa đổi bởi _) là một số nguyên gốc có dấu.
L Số nguyên Coi bốn ký tự liên tiếp (được sửa đổi bởi _) là một số nguyên dài gốc không dấu.
l Số nguyên Coi bốn ký tự liên tiếp (được sửa đổi bởi _) là một số nguyên dài gốc có dấu.
M Chuỗi Có thể in được trích dẫn.
m Chuỗi Được mã hóa Base64.
N Số nguyên Coi bốn ký tự là một ký tự dài không dấu theo thứ tự byte mạng.
n Fixnum Coi hai ký tự là một đoạn ngắn không dấu theo thứ tự byte mạng.
P Chuỗi Xử lý các ký tự sizeof (char *) như một con trỏ và trả về các ký tự \ emph {len} từ vị trí được tham chiếu.
p Chuỗi Xử lý các ký tự sizeof (char *) như một con trỏ đến một chuỗi kết thúc bằng null.
Q Số nguyên Coi tám ký tự là một từ tứ phân không dấu (64 bit).
q Số nguyên Coi tám ký tự là một từ bốn có dấu (64 bit).
S Fixnum Xử lý hai ký tự kế tiếp (khác nhau nếu _ được sử dụng) dưới dạng một đoạn ngắn không dấu theo thứ tự byte gốc.
S Fixnum Xử lý hai ký tự kế tiếp (khác nhau nếu _ được sử dụng) như một ký tự ngắn có dấu theo thứ tự byte gốc.
U Số nguyên Ký tự UTF-8 dưới dạng số nguyên không dấu.
u Chuỗi Được mã hóa UU.
V Fixnum Coi bốn ký tự là một ký tự dài không dấu theo thứ tự byte ít cuối.
v Fixnum Coi hai ký tự là một đoạn ngắn không dấu theo thứ tự byte nhỏ.
w Số nguyên Số nguyên được nén BER.
X   Bỏ qua lùi một ký tự.
x   Bỏ qua một ký tự.
Z Chuỗi Với các giá trị null ở cuối được loại bỏ cho đến null đầu tiên với *.
@   Bỏ qua phần bù được cung cấp bởi đối số độ dài.

Thí dụ

Hãy thử ví dụ sau để giải nén nhiều dữ liệu khác nhau.

"abc \0\0abc \0\0".unpack('A6Z6')   #=> ["abc", "abc "]
"abc \0\0".unpack('a3a3')           #=> ["abc", " \000\000"]
"abc \0abc \0".unpack('Z*Z*')       #=> ["abc ", "abc "]
"aa".unpack('b8B8')                 #=> ["10000110", "01100001"]
"aaa".unpack('h2H2c')               #=> ["16", "61", 97]
"\xfe\xff\xfe\xff".unpack('sS')     #=> [-2, 65534]
"now = 20is".unpack('M*')           #=> ["now is"]
"whole".unpack('xax2aX2aX1aX2a')    #=> ["h", "e", "l", "l", "o"]

Mảng Ruby là các tập hợp được lập chỉ mục số nguyên, có thứ tự của bất kỳ đối tượng nào. Mỗi phần tử trong một mảng được liên kết với và được tham chiếu bởi một chỉ mục.

Lập chỉ mục mảng bắt đầu từ 0, như trong C hoặc Java. Chỉ số âm được giả định liên quan đến phần cuối của mảng --- nghĩa là, chỉ số -1 cho biết phần tử cuối cùng của mảng, -2 là phần tử tiếp theo sau phần tử cuối cùng trong mảng, v.v.

Mảng Ruby có thể chứa các đối tượng như String, Integer, Fixnum, Hash, Symbol, thậm chí là các đối tượng Array khác. Mảng Ruby không cứng nhắc như các mảng trong các ngôn ngữ khác. Mảng Ruby tự động phát triển trong khi thêm các phần tử vào chúng.

Tạo Mảng

Có nhiều cách để tạo hoặc khởi tạo một mảng. Một cách là với phương thức lớp mới -

names = Array.new

Bạn có thể đặt kích thước của một mảng tại thời điểm tạo mảng -

names = Array.new(20)

Mảng tên bây giờ có một kích thước hoặc chiều dài của 20 yếu tố. Bạn có thể trả về kích thước của một mảng bằng các phương thức kích thước hoặc chiều dài -

#!/usr/bin/ruby

names = Array.new(20)
puts names.size  # This returns 20
puts names.length # This also returns 20

Điều này sẽ tạo ra kết quả sau:

20
20

Bạn có thể gán giá trị cho từng phần tử trong mảng như sau:

#!/usr/bin/ruby

names = Array.new(4, "mac")
puts "#{names}"

Điều này sẽ tạo ra kết quả sau:

["mac", "mac", "mac", "mac"]

Bạn cũng có thể sử dụng một khối với mới, điền vào mỗi phần tử với những gì khối đó đánh giá -

#!/usr/bin/ruby

nums = Array.new(10) { |e| e = e * 2 }
puts "#{nums}"

Điều này sẽ tạo ra kết quả sau:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Có một phương thức khác của Array, []. Nó hoạt động như thế này -

nums = Array.[](1, 2, 3, 4,5)

Thêm một hình thức tạo mảng như sau:

nums = Array[1, 2, 3, 4,5]

Các Kernel module có sẵn trong lõi Ruby có một phương pháp Array, mà chỉ chấp nhận một đối số duy nhất. Ở đây, phương thức lấy một phạm vi làm đối số để tạo một mảng các chữ số -

#!/usr/bin/ruby

digits = Array(0..9)
puts "#{digits}"

Điều này sẽ tạo ra kết quả sau:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Phương thức tích hợp mảng

Chúng ta cần có một thể hiện của đối tượng Array để gọi một phương thức Array. Như chúng ta đã thấy, sau đây là cách tạo một thể hiện của đối tượng Array:

Array.[](...) [or] Array[...] [or] [...]

Điều này sẽ trả về một mảng mới được điền với các đối tượng đã cho. Bây giờ, bằng cách sử dụng đối tượng đã tạo, chúng ta có thể gọi bất kỳ phương thức cá thể nào có sẵn. Ví dụ -

#!/usr/bin/ruby

digits = Array(0..9)
num = digits.at(6)
puts "#{num}"

Điều này sẽ tạo ra kết quả sau:

6
Sr.No. Phương pháp & Mô tả
1

array & other_array

Trả về một mảng mới chứa các phần tử chung cho hai mảng, không có phần tử trùng lặp.

2

array * int [or] array * str

Trả về một mảng mới được tạo bằng cách nối các bản sao int của chính nó. Với một đối số Chuỗi, tương đương với self.join (str).

3

array + other_array

Trả về một mảng mới được tạo bằng cách nối hai mảng với nhau để tạo ra mảng thứ ba.

4

array - other_array

Trả về một mảng mới là bản sao của mảng ban đầu, xóa bất kỳ mục nào cũng xuất hiện trong other_array.

5

array <=> other_array

So sánh str với other_str, trả về -1 (nhỏ hơn), 0 (bằng) hoặc 1 (lớn hơn). Sự so sánh là không nhạy cảm.

6

array | other_array

Trả về một mảng mới bằng cách nối mảng với other_array, xóa các bản sao.

7

array << obj

Đẩy đối tượng đã cho vào cuối mảng. Biểu thức này trả về chính mảng, vì vậy một số phần nối có thể được xâu chuỗi với nhau.

số 8

array <=> other_array

Trả về một số nguyên (-1, 0 hoặc +1) nếu mảng này nhỏ hơn, bằng hoặc lớn hơn other_array.

9

array == other_array

Hai mảng bằng nhau nếu chúng chứa cùng số phần tử và nếu mỗi phần tử bằng (theo Object. ==) phần tử tương ứng trong mảng kia.

10

array[index] [or] array[start, length] [or]

array[range] [or] array.slice(index) [or]

array.slice(start, length) [or] array.slice(range)

Trả về phần tử tại chỉ mục hoặc trả về một mảng con bắt đầu từ đầu và tiếp tục cho các phần tử độ dài hoặc trả về một mảng con được chỉ định bởi phạm vi . Các chỉ số âm đếm ngược từ cuối mảng (-1 là phần tử cuối cùng). Trả về nil nếu chỉ mục (hoặc chỉ mục bắt đầu) nằm ngoài phạm vi.

11

array[index] = obj [or]

array[start, length] = obj or an_array or nil [or]

array[range] = obj or an_array or nil

Đặt phần tử tại chỉ mục hoặc thay thế một mảng con bắt đầu từ đầu và tiếp tục cho các phần tử độ dài , hoặc thay thế một mảng con được chỉ định bởi phạm vi . Nếu các chỉ số lớn hơn dung lượng hiện tại của mảng, mảng sẽ tự động phát triển. Các chỉ số âm sẽ đếm ngược từ cuối mảng. Chèn các phần tử nếu độ dài bằng 0. Nếu nil được sử dụng ở dạng thứ hai và thứ ba, hãy xóa các phần tử khỏi bản thân .

12

array.abbrev(pattern = nil)

Tính tập các chữ viết tắt rõ ràng cho các chuỗi trong tự . Nếu được thông qua một mẫu hoặc một chuỗi, chỉ các chuỗi khớp với mẫu hoặc bắt đầu bằng chuỗi mới được xem xét.

13

array.assoc(obj)

Tìm kiếm thông qua một mảng có các phần tử cũng là mảng so sánh obj với phần tử đầu tiên của mỗi mảng được chứa bằng cách sử dụng obj. ==. Trả về mảng được chứa đầu tiên phù hợp hoặc nil nếu không tìm thấy kết quả nào.

14

array.at(index)

Trả về phần tử tại chỉ mục. Chỉ số âm được tính từ cuối bản thân. Trả về nil nếu chỉ mục nằm ngoài phạm vi.

15

array.clear

Loại bỏ tất cả các phần tử khỏi mảng.

16

array.collect { |item| block } [or]

array.map { |item| block }

Gọi khối một lần cho mỗi phần tử của bản thân . Tạo một mảng mới chứa các giá trị được khối trả về.

17

array.collect! { |item| block } [or]

array.map! { |item| block }

Gọi khối một lần cho mỗi phần tử của chính nó , thay thế phần tử bằng giá trị được trả về bởi khối .

18

array.compact

Trả về bản sao của chính nó với tất cả các phần tử nil đã bị xóa.

19

array.compact!

Loại bỏ các phần tử nil khỏi mảng. Trả về nil nếu không có thay đổi nào được thực hiện.

20

array.concat(other_array)

Nối các phần tử trong other_array vào chính nó .

21

array.delete(obj) [or]

array.delete(obj) { block }

Xóa các mục từ tự bằng với obj . Nếu mục không được tìm thấy, trả về nil . Nếu khối mã tùy chọn được đưa ra, trả về kết quả của khối nếu không tìm thấy mục.

22

array.delete_at(index)

Xóa phần tử tại chỉ mục được chỉ định , trả về phần tử đó hoặc nil nếu chỉ mục nằm ngoài phạm vi.

23

array.delete_if { |item| block }

Xóa mọi phần tử của bản thânkhối đánh giá là true.

24

array.each { |item| block }

Cuộc gọi chặn một lần cho mỗi yếu tố trong tự , đi qua yếu tố đó như một tham số.

25

array.each_index { |index| block }

Tương tự như Mảng # mỗi, nhưng chuyển chỉ mục của phần tử thay vì chính phần tử đó.

26

array.empty?

Trả về true nếu mảng tự không chứa phần tử nào.

27

array.eql?(other)

Trả về true nếu mảngmảng khác là cùng một đối tượng hoặc cả hai mảng có cùng nội dung.

28

array.fetch(index) [or]

array.fetch(index, default) [or]

array.fetch(index) { |index| block }

Cố gắng trả về phần tử ở chỉ mục vị trí . Nếu chỉ mục nằm bên ngoài mảng, biểu mẫu đầu tiên ném một ngoại lệ IndexError , biểu mẫu thứ hai trả về mặc định và biểu mẫu thứ ba trả về giá trị của khối gọi , chuyển vào chỉ mục . Giá trị âm của số chỉ mục từ cuối mảng.

29

array.fill(obj) [or]

array.fill(obj, start [, length]) [or]

array.fill(obj, range) [or]

array.fill { |index| block } [or]

array.fill(start [, length] ) { |index| block } [or]

array.fill(range) { |index| block }

Ba hình thức đầu tiên thiết lập các yếu tố lựa chọn của bản thân để obj . Bắt đầu bằng số không tương đương với số không. Độ dài nil tương đương với độ dài của bản thân . Ba biểu mẫu cuối cùng điền vào mảng với giá trị của khối. Các khối được thông qua với chỉ số tuyệt đối của từng yếu tố để được lấp đầy.

30

array.first [or]

array.first(n)

Trả về phần tử đầu tiên hoặc n phần tử đầu tiên của mảng. Nếu mảng trống, biểu mẫu đầu tiên trả về nil và biểu mẫu thứ hai trả về một mảng trống.

31

array.flatten

Trả về một mảng mới là mảng phẳng một chiều của mảng này (một cách đệ quy).

32

array.flatten!

Làm phẳng mảng tại chỗ. Trả về con số không nếu không có sửa đổi nào được thực hiện. (mảng không chứa mảng con.)

33

array.frozen?

Trả về true nếu mảng bị đóng băng (hoặc tạm thời bị đóng băng trong khi được sắp xếp).

34

array.hash

Tính toán mã băm cho mảng. Hai mảng có cùng nội dung sẽ có cùng mã băm.

35

array.include?(obj)

Trả về true nếu obj có trong bản thân , ngược lại là false.

36

array.index(obj)

Trả về chỉ mục của đối tượng đầu tiên tự là == tới obj. Trả về nil nếu không tìm thấy kết quả phù hợp nào.

37

array.indexes(i1, i2, ... iN) [or]

array.indices(i1, i2, ... iN)

Phương thức này không được chấp nhận trong phiên bản Ruby mới nhất, vì vậy hãy sử dụng Array # giá_trị_at.

38

array.indices(i1, i2, ... iN) [or]

array.indexes(i1, i2, ... iN)

Phương thức này không được chấp nhận trong phiên bản Ruby mới nhất, vì vậy hãy sử dụng Array # giá_trị_at.

39

array.insert(index, obj...)

Chèn các giá trị đã cho trước phần tử có chỉ số đã cho (có thể là số âm).

40

array.inspect

Tạo một phiên bản mảng có thể in được.

41

array.join(sep = $,)

Trả về một chuỗi được tạo bằng cách chuyển đổi từng phần tử của mảng thành một chuỗi, được phân tách bằng sep .

42

array.last [or] array.last(n)

Trả về (các) phần tử cuối cùng của bản thân . Nếu mảng trống , biểu mẫu đầu tiên trả về nil .

43

array.length

Trả về số phần tử trong chính nó . Có thể bằng không.

44

array.map { |item| block } [or]

array.collect { |item| block }

Gọi khối một lần cho mỗi phần tử của bản thân . Tạo một mảng mới chứa các giá trị được khối trả về.

45

array.map! { |item| block } [or]

array.collect! { |item| block }

Gọi khối một lần cho mỗi phần tử của mảng , thay thế phần tử bằng giá trị được trả về bởi khối.

46

array.nitems

Returns số phần tử phi nil trong tự . Có thể bằng không.

47

array.pack(aTemplateString)

Đóng gói nội dung của mảng thành một chuỗi nhị phân theo các chỉ thị trong Chuỗi mẫu. Các chỉ thị A, a và Z có thể được theo sau bởi một số đếm, cho biết độ rộng của trường kết quả. Các chỉ thị còn lại cũng có thể có số đếm, cho biết số phần tử mảng cần chuyển đổi. Nếu số đếm là dấu hoa thị (*), tất cả các phần tử mảng còn lại sẽ được chuyển đổi. Bất kỳ chỉ thị nào vẫn có thể được theo sau bởi dấu gạch dưới (_) để sử dụng kích thước gốc của nền tảng cơ bản cho loại được chỉ định; nếu không, họ sử dụng kích thước độc lập nền tảng. Khoảng trắng bị bỏ qua trong chuỗi mẫu.

48

array.pop

Loại bỏ phần tử cuối cùng khỏi mảng và trả về nó, hoặc nil nếu mảng trống.

49

array.push(obj, ...)

Đẩy (nối) đối tượng đã cho vào cuối mảng này. Biểu thức này trả về chính mảng, vì vậy một số phần nối có thể được xâu chuỗi với nhau.

50

array.rassoc(key)

Tìm kiếm thông qua mảng có các phần tử cũng là mảng. So sánh khóa với phần tử thứ hai của mỗi mảng được chứa bằng cách sử dụng dấu ==. Trả về mảng được chứa đầu tiên phù hợp.

51

array.reject { |item| block }

Trả về một mảng mới có chứa các mục mảng mà khối này là không đúng .

52

array.reject! { |item| block }

Xóa các phần tử khỏi mảng mà khối đó đánh giá là true , nhưng trả về nil nếu không có thay đổi nào được thực hiện. Tương đương với Mảng # xóa_nếu.

53

array.replace(other_array)

Thay thế nội dung của mảng bằng nội dung của other_array , cắt bớt hoặc mở rộng nếu cần.

54

array.reverse

Trả về một mảng mới chứa các phần tử của mảng theo thứ tự ngược lại.

55

array.reverse!

Đảo ngược mảng tại chỗ.

56

array.reverse_each {|item| block }

Tương tự như Mảng # mỗi, nhưng đi qua mảng theo thứ tự ngược lại.

57

array.rindex(obj)

Trả về chỉ mục của đối tượng cuối cùng trong mảng == tới obj. Trả về nil nếu không tìm thấy kết quả phù hợp nào.

58

array.select {|item| block }

Gọi khối chuyển các phần tử liên tiếp từ mảng, trả về một mảng có chứa các phần tử mà khối trả về giá trị đúng .

59

array.shift

Trả về phần tử đầu tiên của bản thân và xóa nó (chuyển tất cả các phần tử khác xuống từng phần tử). Trả về nil nếu mảng trống.

60

array.size

Trả về độ dài của mảng (số phần tử). Bí danh cho độ dài.

61

array.slice(index) [or] array.slice(start, length) [or]

array.slice(range) [or] array[index] [or]

array[start, length] [or] array[range]

Trả về phần tử tại chỉ mục hoặc trả về một mảng con bắt đầu từ đầu và tiếp tục cho các phần tử độ dài hoặc trả về một mảng con được chỉ định bởi phạm vi . Các chỉ số âm đếm ngược từ cuối mảng (-1 là phần tử cuối cùng). Trả về nil nếu chỉ mục (hoặc chỉ mục bắt đầu) nằm ngoài phạm vi.

62

array.slice!(index) [or] array.slice!(start, length) [or]

array.slice!(range)

Xóa (các) phần tử được cung cấp bởi một chỉ mục (tùy chọn với độ dài) hoặc theo một phạm vi . Trả về đối tượng, mảng con hoặc nil đã xóa nếu chỉ mục nằm ngoài phạm vi.

63

array.sort [or] array.sort { | a,b | block }

Trả về một mảng mới được tạo bằng cách tự sắp xếp.

64

array.sort! [or] array.sort! { | a,b | block }

Tự phân loại.

65

array.to_a

Tự trả lại . Nếu được gọi trên một lớp con của Mảng , chuyển đổi bộ nhận thành một đối tượng Mảng.

66

array.to_ary

Tự trả lại.

67

array.to_s

Tự trả về. Tham gia.

68

array.transpose

Giả sử rằng bản thân là một mảng của mảng và hoán vị các hàng và cột.

69

array.uniq

Trả về một mảng mới bằng cách xóa các giá trị trùng lặp trong mảng .

70

array.uniq!

Loại bỏ các phần tử trùng lặp khỏi bản thân . Trả về nil nếu không có thay đổi nào được thực hiện (nghĩa là không tìm thấy bản sao).

71

array.unshift(obj, ...)

Thêm các đối tượng vào phía trước của mảng, các phần tử khác lên một.

72

array.values_at(selector,...)

Trả về một mảng chứa các phần tử tương ứng với bộ chọn đã cho (một hoặc nhiều). Các bộ chọn có thể là chỉ số hoặc phạm vi số nguyên.

73

array.zip(arg, ...) [or]

array.zip(arg, ...){ | arr | block }

Chuyển đổi bất kỳ đối số nào thành mảng, sau đó hợp nhất các phần tử của mảng với các phần tử tương ứng từ mỗi đối số.

Hướng gói mảng

Sr.No. Chỉ thị & Mô tả
1

@

Di chuyển đến vị trí tuyệt đối.

2

A

Chuỗi ASCII (đệm khoảng trắng, số đếm là chiều rộng).

3

a

Chuỗi ASCII (đệm rỗng, số lượng là chiều rộng).

4

B

chuỗi (thứ tự bit giảm dần).

5

b

Chuỗi bit (thứ tự bit tăng dần).

6

C

Char không dấu.

7

c

Char.

số 8

D, d

Độ chính xác kép float, định dạng gốc.

9

E

Float chính xác kép, thứ tự byte cuối nhỏ.

10

e

Float chính xác đơn, thứ tự byte cuối nhỏ.

11

F, f

Phao chính xác đơn, định dạng gốc.

12

G

Thứ tự byte float, mạng (big-endian) chính xác kép.

13

g

Thứ tự byte float, mạng (big-endian) chính xác đơn.

14

H

Chuỗi hex (nibble cao trước).

15

h

Chuỗi hex (nibble thấp đầu tiên).

16

I

Số nguyên không dấu.

17

i

Số nguyên.

18

L

Dài không dấu.

19

l

Dài.

20

M

Có thể in được trích dẫn, mã hóa MIME (xem RFC 2045).

21

m

Chuỗi được mã hóa Base64.

22

N

Thứ tự byte dài, mạng (big-endian).

23

n

Thứ tự byte mạng (big-endian) ngắn.

24

P

Con trỏ đến một cấu trúc (chuỗi có độ dài cố định).

25

p

Con trỏ đến một chuỗi được kết thúc bằng null.

26

Q, q

Số 64-bit.

27

S

Ngắn không dấu.

28

s

Ngắn.

29

U

UTF-8.

30

u

Chuỗi được mã hóa UU.

31

V

Thứ tự byte dài, ít cuối.

32

v

Thứ tự byte ngắn, ít endian.

33

w

Số nguyên được nén BER \ fnm.

34

X

Sao lưu một byte.

35

x

Byte rỗng.

36

Z

Tương tự như a, ngoại trừ giá trị null được thêm vào với *.

Thí dụ

Hãy thử ví dụ sau để đóng gói nhiều dữ liệu khác nhau.

a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
puts a.pack("A3A3A3")   #=> "a  b  c  "
puts a.pack("a3a3a3")   #=> "a\000\000b\000\000c\000\000"
puts n.pack("ccc")      #=> "ABC"

Điều này sẽ tạo ra kết quả sau:

a  b  c
abc
ABC

Hash là một tập hợp các cặp khóa-giá trị như sau: "nhân viên" => "lương". Nó tương tự như Mảng, ngoại trừ việc lập chỉ mục được thực hiện thông qua các khóa tùy ý của bất kỳ loại đối tượng nào, không phải là chỉ mục số nguyên.

Thứ tự mà bạn duyệt qua một hàm băm theo khóa hoặc giá trị có thể có vẻ tùy ý và thường sẽ không theo thứ tự chèn. Nếu bạn cố gắng truy cập vào hàm băm có khóa không tồn tại, phương thức sẽ trả về nil .

Tạo mã băm

Như với mảng, có nhiều cách khác nhau để tạo hàm băm. Bạn có thể tạo một băm trống bằng phương thức lớp mới -

months = Hash.new

Bạn cũng có thể sử dụng new để tạo một băm với giá trị mặc định, nếu không thì chỉ là nil -

months = Hash.new( "month" )

or

months = Hash.new "month"

Khi bạn truy cập bất kỳ khóa nào trong hàm băm có giá trị mặc định, nếu khóa hoặc giá trị không tồn tại, việc truy cập vào hàm băm sẽ trả về giá trị mặc định -

#!/usr/bin/ruby

months = Hash.new( "month" )

puts "#{months[0]}"
puts "#{months[72]}"

Điều này sẽ tạo ra kết quả sau:

month
month

#!/usr/bin/ruby

H = Hash["a" => 100, "b" => 200]

puts "#{H['a']}"
puts "#{H['b']}"

Điều này sẽ tạo ra kết quả sau:

100
200

Bạn có thể sử dụng bất kỳ đối tượng Ruby nào làm khóa hoặc giá trị, thậm chí là một mảng, vì vậy ví dụ sau là một ví dụ hợp lệ:

[1,"jan"] => "January"

Hash phương thức tích hợp

Chúng ta cần có một thể hiện của đối tượng Hash để gọi một phương thức Hash. Như chúng ta đã thấy, sau đây là cách tạo một thể hiện của đối tượng Hash:

Hash[[key =>|, value]* ] or

Hash.new [or] Hash.new(obj) [or]
Hash.new { |hash, key| block }

Điều này sẽ trả về một hàm băm mới được điền vào các đối tượng đã cho. Bây giờ bằng cách sử dụng đối tượng đã tạo, chúng ta có thể gọi bất kỳ phương thức cá thể nào có sẵn. Ví dụ -

#!/usr/bin/ruby

$, = ", "
months = Hash.new( "month" )
months = {"1" => "January", "2" => "February"}

keys = months.keys
puts "#{keys}"

Điều này sẽ tạo ra kết quả sau:

["1", "2"]

Sau đây là các phương thức băm công khai (giả sử băm là một đối tượng mảng):

Sr.No. Phương pháp & Mô tả
1

hash == other_hash

Kiểm tra xem hai hàm băm có bằng nhau hay không, dựa trên việc chúng có cùng số lượng cặp khóa-giá trị và liệu các cặp khóa-giá trị có khớp với cặp tương ứng trong mỗi hàm băm hay không.

2

hash.[key]

Sử dụng một khóa, tham chiếu đến một giá trị từ hàm băm. Nếu không tìm thấy khóa, trả về giá trị mặc định.

3

hash.[key] = value

Liên kết giá trị được cung cấp bởi giá trị với khóa được cung cấp bởi khóa .

4

hash.clear

Xóa tất cả các cặp khóa-giá trị khỏi hàm băm.

5

hash.default(key = nil)

Trả về giá trị mặc định cho hàm băm , nil nếu không được đặt theo mặc định =. ([] trả về giá trị mặc định nếu khóa không tồn tại trong hàm băm .)

6

hash.default = obj

Đặt giá trị mặc định cho hàm băm .

7

hash.default_proc

Trả về một khối nếu băm được tạo bởi một khối.

số 8

hash.delete(key) [or]

array.delete(key) { |key| block }

Xóa cặp khóa-giá trị khỏi băm theo khóa . Nếu khối được sử dụng, trả về kết quả của khối nếu không tìm thấy cặp. So sánh delete_if .

9

hash.delete_if { |key,value| block }

Xóa một cặp khóa-giá trị khỏi hàm băm cho mọi cặp mà khối đánh giá là true .

10

hash.each { |key,value| block }

Lặp lại quá trình băm , gọi khối một lần cho mỗi khóa, chuyển khóa-giá trị dưới dạng mảng hai phần tử.

11

hash.each_key { |key| block }

Lặp lại quá trình băm , gọi khối một lần cho mỗi khóa, chuyển khóa làm tham số.

12

hash.each_key { |key_value_array| block }

Lặp lại hàm băm , gọi khối một lần cho mỗi khóa , chuyển khóagiá trị dưới dạng tham số.

13

hash.each_key { |value| block }

Lặp lại trên băm , gọi khối một lần cho mỗi khóa , chuyển giá trị dưới dạng tham số.

14

hash.empty?

Kiểm tra xem hash trống (không chứa cặp khóa-giá trị), trả về true hay false .

15

hash.fetch(key [, default] ) [or]

hash.fetch(key) { | key | block }

Trả về một giá trị từ hàm băm cho khóa đã cho . Nếu chìa khóa không thể được tìm thấy, và không có lý lẽ khác, nó đặt ra một IndexError ngoại lệ; nếu mặc định được đưa ra, nó được trả về; nếu khối tùy chọn được chỉ định, kết quả của nó được trả về.

16

hash.has_key?(key) [or] hash.include?(key) [or]

hash.key?(key) [or] hash.member?(key)

Kiểm tra xem khóa đã cho có trong hàm băm hay không, trả về true hay false .

17

hash.has_value?(value)

Kiểm tra xem hàm băm có chứa giá trị đã cho hay không .

18

hash.index(value)

Trả về khóa cho giá trị đã cho trong hàm băm, nil nếu không tìm thấy giá trị phù hợp.

19

hash.indexes(keys)

Trả về một mảng mới bao gồm các giá trị cho (các) khóa đã cho. Sẽ chèn giá trị mặc định cho các khóa không được tìm thấy. Phương pháp này không được dùng nữa. Sử dụng lựa chọn.

20

hash.indices(keys)

Trả về một mảng mới bao gồm các giá trị cho (các) khóa đã cho. Sẽ chèn giá trị mặc định cho các khóa không được tìm thấy. Phương pháp này không được dùng nữa. Sử dụng lựa chọn.

21

hash.inspect

Trả về một phiên bản chuỗi in đẹp của băm.

22

hash.invert

Tạo một hàm băm mới , đảo ngược các khóagiá trị từ hàm băm ; nghĩa là, trong hàm băm mới, các khóa từ hàm băm trở thành giá trị và giá trị trở thành khóa.

23

hash.keys

Tạo một mảng mới với các khóa từ băm .

24

hash.length

Trả về kích thước hoặc độ dài của hàm băm dưới dạng số nguyên.

25

hash.merge(other_hash) [or]

hash.merge(other_hash) { |key, oldval, newval| block }

Trả về một băm mới có chứa nội dung của bămother_hash , ghi đè các cặp trong băm bằng các khóa trùng lặp với các khóa từ other_hash .

26

hash.merge!(other_hash) [or]

hash.merge!(other_hash) { |key, oldval, newval| block }

Tương tự như hợp nhất, nhưng các thay đổi được thực hiện tại chỗ.

27

hash.rehash

Xây dựng lại băm dựa trên các giá trị hiện tại cho mỗi khóa . Nếu các giá trị đã thay đổi kể từ khi chúng được chèn vào, phương pháp này sẽ lập chỉ mục lại hàm băm .

28

hash.reject { |key, value| block }

Tạo một hàm băm mới cho mọi cặp mà khối đánh giá là true

29

hash.reject! { |key, value| block }

Tương tự như từ chối , nhưng các thay đổi được thực hiện tại chỗ.

30

hash.replace(other_hash)

Thay thế nội dung của băm bằng nội dung của other_hash .

31

hash.select { |key, value| block }

Trả về một mảng mới bao gồm các cặp khóa-giá trị từ hàm bămkhối trả về true .

32

hash.shift

Loại bỏ một cặp khóa-giá trị khỏi hàm băm , trả lại nó dưới dạng một mảng hai phần tử.

33

hash.size

Trả về kích thước hoặc độ dài của hàm băm dưới dạng số nguyên.

34

hash.sort

Chuyển đổi hàm băm thành một mảng hai chiều chứa các mảng cặp khóa-giá trị, sau đó sắp xếp nó thành một mảng.

35

hash.store(key, value)

Lưu trữ một cặp khóa-giá trị trong hàm băm .

36

hash.to_a

Tạo mảng hai chiều từ hàm băm. Mỗi cặp khóa / giá trị được chuyển đổi thành một mảng và tất cả các mảng này được lưu trữ trong một mảng chứa.

37

hash.to_hash

Trả về hàm băm (bản thân).

38

hash.to_s

Chuyển đổi hàm băm thành một mảng, sau đó chuyển đổi mảng đó thành một chuỗi.

39

hash.update(other_hash) [or]

hash.update(other_hash) {|key, oldval, newval| block}

Trả về một băm mới có chứa nội dung của bămother_hash , ghi đè các cặp trong băm bằng các khóa trùng lặp với các khóa từ other_hash .

40

hash.value?(value)

Kiểm tra xem hàm băm có chứa giá trị đã cho hay không .

41

hash.values

Trả về một mảng mới chứa tất cả các giá trị của hàm băm .

42

hash.values_at(obj, ...)

Trả về một mảng mới chứa các giá trị từ hàm băm được liên kết với khóa hoặc các khóa đã cho.

Các Timelớp đại diện cho ngày và giờ trong Ruby. Nó là một lớp mỏng bên trên chức năng ngày và giờ của hệ thống do hệ điều hành cung cấp. Lớp này có thể không có trên hệ thống của bạn để đại diện cho các ngày trước năm 1970 hoặc sau năm 2038.

Chương này giúp bạn làm quen với tất cả các khái niệm ngày và giờ mong muốn nhất.

Lấy ngày và giờ hiện tại

Sau đây là ví dụ đơn giản để lấy ngày và giờ hiện tại -

#!/usr/bin/ruby -w

time1 = Time.new
puts "Current Time : " + time1.inspect

# Time.now is a synonym:
time2 = Time.now
puts "Current Time : " + time2.inspect

Điều này sẽ tạo ra kết quả sau:

Current Time : Mon Jun 02 12:02:39 -0700 2008
Current Time : Mon Jun 02 12:02:39 -0700 2008

Nhận các thành phần của ngày và giờ

Chúng ta có thể sử dụng đối tượng Thời gian để lấy các thành phần khác nhau của ngày và giờ. Sau đây là ví dụ hiển thị tương tự -

#!/usr/bin/ruby -w

time = Time.new

# Components of a Time
puts "Current Time : " + time.inspect
puts time.year    # => Year of the date 
puts time.month   # => Month of the date (1 to 12)
puts time.day     # => Day of the date (1 to 31 )
puts time.wday    # => 0: Day of week: 0 is Sunday
puts time.yday    # => 365: Day of year
puts time.hour    # => 23: 24-hour clock
puts time.min     # => 59
puts time.sec     # => 59
puts time.usec    # => 999999: microseconds
puts time.zone    # => "UTC": timezone name

Điều này sẽ tạo ra kết quả sau:

Current Time : Mon Jun 02 12:03:08 -0700 2008
2008
6
2
1
154
12
3
8
247476
UTC

Các hàm Time.utc, Time.gm và Time.local

Hai hàm này có thể được sử dụng để định dạng ngày tháng theo định dạng chuẩn như sau:

# July 8, 2008
Time.local(2008, 7, 8)  
# July 8, 2008, 09:10am, local time
Time.local(2008, 7, 8, 9, 10)   
# July 8, 2008, 09:10 UTC
Time.utc(2008, 7, 8, 9, 10)  
# July 8, 2008, 09:10:11 GMT (same as UTC)
Time.gm(2008, 7, 8, 9, 10, 11)

Dưới đây là ví dụ để lấy tất cả các thành phần trong một mảng ở định dạng sau:

[sec,min,hour,day,month,year,wday,yday,isdst,zone]

Hãy thử cách sau -

#!/usr/bin/ruby -w

time = Time.new
values = time.to_a
p values

Điều này sẽ tạo ra kết quả sau:

[26, 10, 12, 2, 6, 2008, 1, 154, false, "MST"]

Mảng này có thể được chuyển cho các hàm Time.utc hoặc Time.local để có được các định dạng ngày tháng khác nhau như sau:

#!/usr/bin/ruby -w

time = Time.new
values = time.to_a
puts Time.utc(*values)

Điều này sẽ tạo ra kết quả sau:

Mon Jun 02 12:15:36 UTC 2008

Sau đây là cách để tính thời gian được biểu thị nội bộ dưới dạng giây kể từ kỷ nguyên (phụ thuộc vào nền tảng) -

# Returns number of seconds since epoch
time = Time.now.to_i  

# Convert number of seconds into Time object.
Time.at(time)

# Returns second since epoch which includes microseconds
time = Time.now.to_f

Múi giờ và Giờ tiết kiệm ánh sáng ban ngày

Bạn có thể sử dụng đối tượng Thời gian để nhận tất cả thông tin liên quan đến Múi giờ và tiết kiệm ánh sáng ban ngày như sau:

time = Time.new

# Here is the interpretation
time.zone       # => "UTC": return the timezone
time.utc_offset # => 0: UTC is 0 seconds offset from UTC
time.zone       # => "PST" (or whatever your timezone is)
time.isdst      # => false: If UTC does not have DST.
time.utc?       # => true: if t is in UTC time zone
time.localtime  # Convert to local timezone.
time.gmtime     # Convert back to UTC.
time.getlocal   # Return a new Time object in local zone
time.getutc     # Return a new Time object in UTC

Định dạng thời gian và ngày

Có nhiều cách khác nhau để định dạng ngày và giờ. Đây là một ví dụ cho thấy một vài -

#!/usr/bin/ruby -w

time = Time.new
puts time.to_s
puts time.ctime
puts time.localtime
puts time.strftime("%Y-%m-%d %H:%M:%S")

Điều này sẽ tạo ra kết quả sau:

Mon Jun 02 12:35:19 -0700 2008
Mon Jun  2 12:35:19 2008
Mon Jun 02 12:35:19 -0700 2008
2008-06-02 12:35:19

Hướng dẫn định dạng thời gian

Các lệnh này trong bảng sau được sử dụng với phương thức Time.strftime .

Sr.No. Chỉ thị & Mô tả
1

%a

Tên viết tắt của ngày trong tuần (Mặt trời).

2

%A

Tên đầy đủ các ngày trong tuần (Chủ nhật).

3

%b

Tên tháng viết tắt (Jan).

4

%B

Tên đầy đủ của tháng (tháng Giêng).

5

%c

Biểu diễn ngày và giờ địa phương ưa thích.

6

%d

Ngày trong tháng (01 đến 31).

7

%H

Giờ trong ngày, đồng hồ 24 giờ (00 đến 23).

số 8

%I

Giờ trong ngày, đồng hồ 12 giờ (01 đến 12).

9

%j

Ngày trong năm (001 đến 366).

10

%m

Tháng trong năm (01 đến 12).

11

%M

Phút của giờ (00 đến 59).

12

%p

Chỉ báo kinh tuyến (AM hoặc PM).

13

%S

Giây của phút (00 đến 60).

14

%U

Số tuần của năm hiện tại, bắt đầu với Chủ nhật đầu tiên là ngày đầu tiên của tuần đầu tiên (00 đến 53).

15

%W

Số tuần của năm hiện tại, bắt đầu với thứ Hai đầu tiên là ngày đầu tiên của tuần đầu tiên (00 đến 53).

16

%w

Ngày trong tuần (Chủ nhật là 0, 0 đến 6).

17

%x

Đại diện ưu tiên cho ngày một mình, không có thời gian.

18

%X

Đại diện ưu tiên cho thời gian một mình, không có ngày.

19

%y

Năm không có một thế kỷ (00 đến 99).

20

%Y

Năm với thế kỷ.

21

%Z

Tên múi giờ.

22

%%

Ký tự% theo nghĩa đen.

Số học thời gian

Bạn có thể thực hiện số học đơn giản với thời gian như sau:

now = Time.now          # Current time
puts now

past = now - 10         # 10 seconds ago. Time - number => Time
puts past

future = now + 10  # 10 seconds from now Time + number => Time
puts future

diff = future - past     # => 10  Time - Time => number of seconds
puts diff

Điều này sẽ tạo ra kết quả sau:

Thu Aug 01 20:57:05 -0700 2013
Thu Aug 01 20:56:55 -0700 2013
Thu Aug 01 20:57:15 -0700 2013
20.0

Phạm vi xảy ra ở khắp mọi nơi: tháng 1 đến tháng 12, 0 đến 9, dòng 50 đến 67, v.v. Ruby hỗ trợ phạm vi và cho phép chúng tôi sử dụng phạm vi theo nhiều cách khác nhau -

  • Phạm vi dưới dạng chuỗi
  • Phạm vi như điều kiện
  • Phạm vi dưới dạng khoảng thời gian

Phạm vi dưới dạng chuỗi

Việc đầu tiên và có lẽ là cách sử dụng tự nhiên nhất của phạm vi là biểu thị một chuỗi. Chuỗi có điểm bắt đầu, điểm kết thúc và cách tạo ra các giá trị liên tiếp trong chuỗi.

Ruby tạo các chuỗi này bằng cách sử dụng ''..''''...''toán tử phạm vi. Biểu mẫu hai chấm tạo ra một phạm vi bao gồm, trong khi biểu mẫu ba chấm tạo ra một phạm vi loại trừ giá trị cao được chỉ định.

(1..5)        #==> 1, 2, 3, 4, 5
(1...5)       #==> 1, 2, 3, 4
('a'..'d')    #==> 'a', 'b', 'c', 'd'

Chuỗi 1..100 được giữ như một đối tượng Phạm vi chứa các tham chiếu đến hai đối tượng Fixnum . Nếu cần, bạn có thể chuyển đổi một dải ô thành một danh sách bằng phương thức to_a . Hãy thử ví dụ sau:

#!/usr/bin/ruby

$, =", "   # Array value separator
range1 = (1..10).to_a
range2 = ('bar'..'bat').to_a

puts "#{range1}"
puts "#{range2}"

Điều này sẽ tạo ra kết quả sau:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
["bar", "bas", "bat"]

Phạm vi triển khai các phương pháp cho phép bạn lặp lại chúng và kiểm tra nội dung của chúng theo nhiều cách -

#!/usr/bin/ruby

# Assume a range
digits = 0..9

puts digits.include?(5)
ret = digits.min
puts "Min value is #{ret}"

ret = digits.max
puts "Max value is #{ret}"

ret = digits.reject {|i| i < 5 }
puts "Rejected values are #{ret}"

digits.each do |digit|
   puts "In Loop #{digit}"
end

Điều này sẽ tạo ra kết quả sau:

true
Min value is 0
Max value is 9
Rejected values are 5, 6, 7, 8, 9
In Loop 0
In Loop 1
In Loop 2
In Loop 3
In Loop 4
In Loop 5
In Loop 6
In Loop 7
In Loop 8
In Loop 9

Phạm vi như điều kiện

Dải ô cũng có thể được sử dụng làm biểu thức điều kiện. Ví dụ: đoạn mã sau sẽ in các tập hợp các dòng từ đầu vào chuẩn, trong đó dòng đầu tiên trong mỗi tập hợp chứa từ bắt đầu và dòng cuối cùng của từ kết thúc :

while gets
   print if /start/../end/
end

Các dãy có thể được sử dụng trong các câu lệnh trường hợp -

#!/usr/bin/ruby

score = 70

result = case score
   when 0..40 then "Fail"
   when 41..60 then "Pass"
   when 61..70 then "Pass with Merit"
   when 71..100 then "Pass with Distinction"
   else "Invalid Score"
end

puts result

Điều này sẽ tạo ra kết quả sau:

Pass with Merit

Phạm vi dưới dạng khoảng thời gian

Việc sử dụng cuối cùng của phạm vi đa năng là như một bài kiểm tra khoảng thời gian: xem liệu một số giá trị có nằm trong khoảng được đại diện bởi phạm vi hay không. Điều này được thực hiện bằng cách sử dụng ===, toán tử bình đẳng trường hợp.

#!/usr/bin/ruby

if ((1..10) === 5)
   puts "5 lies in (1..10)"
end

if (('a'..'j') === 'c')
   puts "c lies in ('a'..'j')"
end

if (('a'..'j') === 'z')
   puts "z lies in ('a'..'j')"
end

Điều này sẽ tạo ra kết quả sau:

5 lies in (1..10)
c lies in ('a'..'j')

Trình lặp không là gì ngoài các phương thức được hỗ trợ bởi các bộ sưu tập . Các đối tượng lưu trữ một nhóm thành viên dữ liệu được gọi là tập hợp. Trong Ruby, mảng và băm có thể được gọi là tập hợp.

Các trình lặp trả về tất cả các phần tử của một tập hợp, cái này đến phần tử khác. Chúng ta sẽ thảo luận về hai trình vòng lặp ở đây, mỗi trình vòng lặp và thu thập . Hãy xem xét những điều này một cách chi tiết.

Ruby từng Iterator

Mỗi trình lặp trả về tất cả các phần tử của một mảng hoặc một hàm băm.

Cú pháp

collection.each do |variable|
   code
end

Thực thi cho mỗi phần tử trong bộ sưu tập . Ở đây, tập hợp có thể là một mảng hoặc một băm ruby.

Thí dụ

#!/usr/bin/ruby

ary = [1,2,3,4,5]
ary.each do |i|
   puts i
end

Điều này sẽ tạo ra kết quả sau:

1
2
3
4
5

Bạn luôn liên kết mỗi trình lặp với một khối. Nó trả về từng giá trị của mảng, từng giá trị một, cho khối. Giá trị được lưu trữ trong biếni và sau đó hiển thị trên màn hình.

Trình thu thập Ruby

Trình lặp thu thập trả về tất cả các phần tử của một tập hợp.

Cú pháp

collection = collection.collect

Các thu thập phương pháp không cần phải luôn luôn được gắn liền với một khối. Các thu thập phương thức trả về toàn bộ bộ sưu tập, bất kể cho dù đó là một mảng hoặc một băm.

Thí dụ

#!/usr/bin/ruby

a = [1,2,3,4,5]
b = Array.new
b = a.collect
puts b

Điều này sẽ tạo ra kết quả sau:

1
2
3
4
5

NOTE- Phương thức thu thập không phải là cách thích hợp để thực hiện việc sao chép giữa các mảng. Có một phương thức khác được gọi là bản sao , nên được sử dụng để sao chép một mảng này sang một mảng khác.

Bạn thường sử dụng phương thức thu thập khi bạn muốn làm điều gì đó với mỗi giá trị để nhận được mảng mới. Ví dụ, đoạn mã này tạo ra một mảng b chứa 10 lần mỗi giá trị trong a .

#!/usr/bin/ruby

a = [1,2,3,4,5]
b = a.collect{|x| 10*x}
puts b

Điều này sẽ tạo ra kết quả sau:

10
20
30
40
50

Ruby cung cấp một tập hợp toàn bộ các phương thức liên quan đến I / O được thực hiện trong mô-đun Kernel. Tất cả các phương thức I / O đều bắt nguồn từ lớp IO.

Lớp IO cung cấp tất cả các phương thức cơ bản, chẳng hạn như đọc, viết, được, đặt, readline, getcprintf .

Chương này sẽ trình bày tất cả các chức năng I / O cơ bản có trong Ruby. Để biết thêm các chức năng, vui lòng tham khảo Ruby Class IO .

Tuyên bố đặt

Trong các chương trước, bạn đã gán giá trị cho các biến và sau đó in đầu ra bằng câu lệnh put .

Câu lệnh put hướng dẫn chương trình hiển thị giá trị được lưu trữ trong biến. Thao tác này sẽ thêm một dòng mới vào cuối mỗi dòng mà nó viết.

Thí dụ

#!/usr/bin/ruby

val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2

Điều này sẽ tạo ra kết quả sau:

This is variable one
This is variable two

Tuyên bố được

Các bị cáo có thể được sử dụng để lấy bất kỳ đầu vào từ người sử dụng từ màn hình tiêu chuẩn gọi là STDIN.

Thí dụ

Đoạn mã sau chỉ cho bạn cách sử dụng câu lệnh get. Mã này sẽ nhắc người dùng nhập một giá trị, giá trị này sẽ được lưu trữ trong một biến val và cuối cùng sẽ được in trên STDOUT.

#!/usr/bin/ruby

puts "Enter a value :"
val = gets
puts val

Điều này sẽ tạo ra kết quả sau:

Enter a value :
This is entered value
This is entered value

Câu lệnh putc

Không giống như câu lệnh put xuất toàn bộ chuỗi ra màn hình, câu lệnh putc có thể được sử dụng để xuất một ký tự tại một thời điểm.

Thí dụ

Đầu ra của đoạn mã sau chỉ là ký tự H -

#!/usr/bin/ruby

str = "Hello Ruby!"
putc str

Điều này sẽ tạo ra kết quả sau:

H

Tuyên bố in

Câu lệnh print tương tự như câu lệnh put . Sự khác biệt duy nhất là câu lệnh put sẽ chuyển đến dòng tiếp theo sau khi in nội dung, trong khi với câu lệnh print , con trỏ được đặt trên cùng một dòng.

Thí dụ

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

Điều này sẽ tạo ra kết quả sau:

Hello WorldGood Morning

Mở và đóng tệp

Cho đến bây giờ, bạn đã đọc và ghi vào đầu vào và đầu ra tiêu chuẩn. Bây giờ, chúng ta sẽ xem cách chơi với các tệp dữ liệu thực tế.

Phương pháp File.new

Bạn có thể tạo một đối tượng Tệp bằng cách sử dụng phương thức File.new để đọc, ghi hoặc cả hai, theo chuỗi chế độ. Cuối cùng, bạn có thể sử dụng phương thức File.close để đóng tệp đó.

Cú pháp

aFile = File.new("filename", "mode")
   # ... process the file
aFile.close

Phương thức File.open

Bạn có thể sử dụng phương thức File.open để tạo một đối tượng tệp mới và gán đối tượng tệp đó cho một tệp. Tuy nhiên, có một sự khác biệt giữa File.openFile.new phương pháp. Sự khác biệt là phương thức File.open có thể được liên kết với một khối, trong khi bạn không thể làm điều tương tự bằng phương thức File.new .

File.open("filename", "mode") do |aFile|
   # ... process the file
end
Sr.No. Chế độ & Mô tả
1

r

Read-only mode. The file pointer is placed at the beginning of the file. This is the default mode.

2

r+

Read-write mode. The file pointer will be at the beginning of the file.

3

w

Write-only mode. Overwrites the file if the file exists. If the file does not exist, creates a new file for writing.

4

w+

Read-write mode. Overwrites the existing file if the file exists. If the file does not exist, creates a new file for reading and writing.

5

a

Write-only mode. The file pointer is at the end of the file if the file exists. That is, the file is in the append mode. If the file does not exist, it creates a new file for writing.

6

a+

Read and write mode. The file pointer is at the end of the file if the file exists. The file opens in the append mode. If the file does not exist, it creates a new file for reading and writing.

Reading and Writing Files

The same methods that we've been using for 'simple' I/O are available for all file objects. So, gets reads a line from standard input, and aFile.gets reads a line from the file object aFile.

However, I/O objects provides additional set of access methods to make our lives easier.

The sysread Method

You can use the method sysread to read the contents of a file. You can open the file in any of the modes when using the method sysread. For example −

Following is the input text file −

This is a simple text file for testing purpose.

Now let's try to read this file −

#!/usr/bin/ruby

aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   puts "Unable to open file!"
end

This statement will output the first 20 characters of the file. The file pointer will now be placed at the 21st character in the file.

The syswrite Method

You can use the method syswrite to write the contents into a file. You need to open the file in write mode when using the method syswrite. For example −

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
else
   puts "Unable to open file!"
end

This statement will write "ABCDEF" into the file.

The each_byte Method

This method belongs to the class File. The method each_byte is always associated with a block. Consider the following code sample −

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   puts "Unable to open file!"
end

Characters are passed one by one to the variable ch and then displayed on the screen as follows −

s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.

The IO.readlines Method

The class File is a subclass of the class IO. The class IO also has some methods, which can be used to manipulate files.

One of the IO class methods is IO.readlines. This method returns the contents of the file line by line. The following code displays the use of the method IO.readlines

#!/usr/bin/ruby

arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

In this code, the variable arr is an array. Each line of the file input.txt will be an element in the array arr. Therefore, arr[0] will contain the first line, whereas arr[1] will contain the second line of the file.

The IO.foreach Method

Phương thức này cũng trả về đầu ra từng dòng. Sự khác biệt giữa phương pháp foreach và phương pháp readlines là phương pháp foreach được gắn liền với một khối. Tuy nhiên, không giống như các phương pháp readlines , phương pháp foreach không trả lại một mảng. Ví dụ -

#!/usr/bin/ruby

IO.foreach("input.txt"){|block| puts block}

Đoạn mã này sẽ chuyển nội dung của dòng kiểm tra tệp theo từng dòng tới khối biến, và sau đó kết quả sẽ được hiển thị trên màn hình.

Đổi tên và xóa tệp

Bạn có thể đổi tên và xóa tệp theo chương trình bằng Ruby với các phương pháp đổi tênxóa .

Sau đây là ví dụ để đổi tên tệp hiện có test1.txt -

#!/usr/bin/ruby

# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )

Sau đây là ví dụ để xóa một tệp test2.txt hiện có -

#!/usr/bin/ruby

# Delete file test2.txt
File.delete("test2.txt")

Chế độ tệp và quyền sở hữu

Sử dụng phương thức chmod với mặt nạ để thay đổi chế độ hoặc danh sách quyền / quyền truy cập của tệp -

Sau đây là ví dụ để thay đổi chế độ của tệp test.txt hiện có thành giá trị mặt nạ:

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )
Sr.No. Mặt nạ & Mô tả
1

0700

mặt nạ rwx cho chủ sở hữu

2

0400

r cho chủ sở hữu

3

0200

w cho chủ sở hữu

4

0100

x cho chủ sở hữu

5

0070

mặt nạ rwx cho nhóm

6

0040

r cho nhóm

7

0020

w cho nhóm

số 8

0010

x cho nhóm

9

0007

mặt nạ rwx cho cái khác

10

0004

r cho người khác

11

0002

w cho cái khác

12

0001

x cho người khác

13

4000

Đặt ID người dùng khi thực thi

14

2000

Đặt ID nhóm khi thực thi

15

1000

Lưu văn bản đã hoán đổi, ngay cả sau khi sử dụng

Yêu cầu tệp

Lệnh sau kiểm tra xem tệp có tồn tại hay không trước khi mở nó:

#!/usr/bin/ruby

File.open("file.rb") if File::exists?( "file.rb" )

Lệnh sau hỏi xem tệp có thực sự là tệp hay không -

#!/usr/bin/ruby

# This returns either true or false
File.file?( "text.txt" )

Lệnh sau tìm xem tên tệp đã cho có phải là một thư mục hay không -

#!/usr/bin/ruby

# a directory
File::directory?( "/usr/local/bin" ) # => true

# a file
File::directory?( "file.rb" ) # => false

Lệnh sau tìm xem tệp có thể đọc, ghi hay thực thi được hay không:

#!/usr/bin/ruby

File.readable?( "test.txt" )   # => true
File.writable?( "test.txt" )   # => true
File.executable?( "test.txt" ) # => false

Lệnh sau tìm xem tệp có kích thước bằng 0 hay không:

#!/usr/bin/ruby

File.zero?( "test.txt" )      # => true

Lệnh sau trả về kích thước của tệp:

#!/usr/bin/ruby

File.size?( "text.txt" )     # => 1002

Lệnh sau có thể được sử dụng để tìm ra một loại tệp:

#!/usr/bin/ruby

File::ftype( "test.txt" )     # => file

Phương thức ftype xác định loại tệp bằng cách trả về một trong những phần sau - tệp, thư mục, characterSpecial, blockSpecial, Fifo, link, socket, hoặc không xác định.

Lệnh sau có thể được sử dụng để tìm thời điểm tệp được tạo, sửa đổi hoặc truy cập lần cuối:

#!/usr/bin/ruby

File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Thư mục trong Ruby

Tất cả các tệp được chứa trong các thư mục khác nhau và Ruby cũng không gặp vấn đề gì khi xử lý chúng. Trong khi lớp Tệp xử lý tệp, thư mục được xử lý bằng lớp Dir .

Điều hướng qua các thư mục

Để thay đổi thư mục trong chương trình Ruby, hãy sử dụng Dir.chdir như sau. Ví dụ này thay đổi thư mục hiện tại thành / usr / bin .

Dir.chdir("/usr/bin")

Bạn có thể tìm ra thư mục hiện tại với Dir.pwd -

puts Dir.pwd # This will return something like /usr/bin

Bạn có thể lấy danh sách các tệp và thư mục trong một thư mục cụ thể bằng cách sử dụng Dir.entries -

puts Dir.entries("/usr/bin").join(' ')

Dir.entries trả về một mảng có tất cả các mục trong thư mục được chỉ định. Dir.foreach cung cấp cùng một tính năng -

Dir.foreach("/usr/bin") do |entry|
   puts entry
end

Một cách ngắn gọn hơn nữa để lấy danh sách thư mục là sử dụng phương thức mảng lớp của Dir -

Dir["/usr/bin/*"]

Tạo một thư mục

Các Dir.mkdir thể được sử dụng để tạo ra các thư mục -

Dir.mkdir("mynewdir")

Bạn cũng có thể đặt quyền trên một thư mục mới (không phải thư mục đã tồn tại) với mkdir -

NOTE - Mặt nạ 755 đặt quyền chủ sở hữu, nhóm, thế giới [bất kỳ ai] thành rwxr-xr-x trong đó r = read, w = write và x = thi hành.

Dir.mkdir( "mynewdir", 755 )

Xóa thư mục

Các Dir.delete có thể được sử dụng để xóa một thư mục. Các Dir.unlinkDir.rmdir Thực hiện chính xác các chức năng tương tự và được cung cấp cho thuận tiện.

Dir.delete("testdir")

Tạo tệp & thư mục tạm thời

Tệp tạm thời là những tệp có thể được tạo trong thời gian ngắn trong quá trình thực thi chương trình nhưng không phải là nơi lưu trữ thông tin vĩnh viễn.

Dir.tmpdir cung cấp đường dẫn đến thư mục tạm thời trên hệ thống hiện tại, mặc dù phương thức này không khả dụng theo mặc định. Để làm cho Dir.tmpdir khả dụng, bạn cần sử dụng request 'tmpdir'.

Bạn có thể sử dụng Dir.tmpdir với File.join để tạo tệp tạm thời độc lập với nền tảng -

require 'tmpdir'
   tempfilename = File.join(Dir.tmpdir, "tingtong")
   tempfile = File.new(tempfilename, "w")
   tempfile.puts "This is a temporary file"
   tempfile.close
   File.delete(tempfilename)

Mã này tạo một tệp tạm thời, ghi dữ liệu vào tệp đó và xóa tệp đó. Thư viện chuẩn của Ruby cũng bao gồm một thư viện gọi là Tempfile có thể tạo các tệp tạm thời cho bạn -

require 'tempfile'
   f = Tempfile.new('tingtong')
   f.puts "Hello"
   puts f.path
   f.close

Chức năng tích hợp sẵn

Dưới đây là các chức năng tích hợp của ruby ​​để xử lý tệp và thư mục -

  • Lớp tệp và phương thức .

  • Lớp và Phương thức Dir .

Việc thực thi và ngoại lệ luôn đi cùng nhau. Nếu bạn đang mở một tệp không tồn tại, thì nếu bạn không xử lý tình huống này đúng cách, thì chương trình của bạn được coi là có chất lượng kém.

Chương trình dừng nếu một ngoại lệ xảy ra. Vì vậy, các ngoại lệ được sử dụng để xử lý các loại lỗi khác nhau, có thể xảy ra trong quá trình thực thi chương trình và thực hiện hành động thích hợp thay vì dừng chương trình hoàn toàn.

Ruby cung cấp một cơ chế tốt để xử lý các ngoại lệ. Chúng tôi đính kèm đoạn mã có thể tạo ra một ngoại lệ trong khối bắt đầu / kết thúc và sử dụng các mệnh đề cứu hộ để cho Ruby biết các loại ngoại lệ mà chúng tôi muốn xử lý.

Cú pháp

begin  
# -  
rescue OneTypeOfException  
# -  
rescue AnotherTypeOfException  
# -  
else  
# Other exceptions
ensure
# Always will be executed
end

Mọi thứ từ đầu đến cứu đều được bảo vệ. Nếu một ngoại lệ xảy ra trong quá trình thực thi khối mã này, quyền kiểm soát sẽ được chuyển cho khối giữa cứu hộkết thúc .

Đối với mỗi mệnh đề cứu trong khối bắt đầu , Ruby lần lượt so sánh Ngoại lệ được nâng lên với từng tham số. Trận đấu sẽ thành công nếu ngoại lệ được đặt tên trong mệnh đề cứu giống với loại ngoại lệ hiện đang được ném hoặc là một lớp cha của ngoại lệ đó.

Trong trường hợp ngoại lệ không khớp với bất kỳ loại lỗi nào được chỉ định, chúng tôi được phép sử dụng mệnh đề else sau tất cả các mệnh đề cứu .

Thí dụ

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
      file = STDIN
end
print file, "==", STDIN, "\n"

Điều này sẽ tạo ra kết quả sau. Bạn có thể thấy rằng STDIN được thay thế thành tệp do không mở được .

#<IO:0xb7d16f84>==#<IO:0xb7d16f84>

Sử dụng câu lệnh thử lại

Bạn có thể nắm bắt một ngoại lệ bằng cách sử dụng khối giải cứu và sau đó sử dụng câu lệnh thử lại để thực thi khối begin từ đầu.

Cú pháp

begin
   # Exceptions raised by this code will 
   # be caught by the following rescue clause
rescue
   # This block will capture all types of exceptions
   retry  # This will move control to the beginning of begin
end

Thí dụ

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
   fname = "existant_file"
   retry
end

Sau đây là quy trình:

  • Đã xảy ra ngoại lệ lúc mở cửa.
  • Đã đi giải cứu. fname đã được chỉ định lại.
  • Bằng cách thử lại bắt đầu từ đầu.
  • Thời gian này tệp mở thành công.
  • Tiếp tục quá trình thiết yếu.

NOTE- Lưu ý rằng nếu tệp của tên được thay thế không tồn tại, mã ví dụ này sẽ thử lại vô hạn. Hãy cẩn thận nếu bạn sử dụng thử lại cho một quy trình ngoại lệ.

Sử dụng tuyên bố tăng

Bạn có thể sử dụng tăng tuyên bố để nâng cao một ngoại lệ. Phương thức sau tạo ra một ngoại lệ bất cứ khi nào nó được gọi. Tin nhắn thứ hai sẽ được in.

Cú pháp

raise 

OR

raise "Error Message" 

OR

raise ExceptionType, "Error Message"

OR

raise ExceptionType, "Error Message" condition

Dạng đầu tiên chỉ cần tăng lại ngoại lệ hiện tại (hoặc RuntimeError nếu không có ngoại lệ hiện tại). Điều này được sử dụng trong các trình xử lý ngoại lệ cần chặn một ngoại lệ trước khi chuyển nó.

Dạng thứ hai tạo một ngoại lệ RuntimeError mới , đặt thông điệp của nó thành chuỗi đã cho. Ngoại lệ này sau đó được nâng lên ngăn xếp cuộc gọi.

Dạng thứ ba sử dụng đối số đầu tiên để tạo một ngoại lệ và sau đó đặt thông báo được liên kết thành đối số thứ hai.

Dạng thứ tư tương tự như dạng thứ ba nhưng bạn có thể thêm bất kỳ câu lệnh điều kiện nào như trừ khi để nêu ra một ngoại lệ.

Thí dụ

#!/usr/bin/ruby

begin  
   puts 'I am before the raise.'  
   raise 'An error has occurred.'  
   puts 'I am after the raise.'  
rescue  
   puts 'I am rescued.'  
end  
puts 'I am after the begin block.'

Điều này sẽ tạo ra kết quả sau:

I am before the raise.  
I am rescued.  
I am after the begin block.

Thêm một ví dụ cho thấy việc sử dụng tăng lương -

#!/usr/bin/ruby

begin  
   raise 'A test exception.'  
rescue Exception => e  
   puts e.message  
   puts e.backtrace.inspect  
end

Điều này sẽ tạo ra kết quả sau:

A test exception.
["main.rb:4"]

Sử dụng Câu lệnh ensure

Đôi khi, bạn cần đảm bảo rằng một số quá trình xử lý được thực hiện ở cuối khối mã, bất kể có ngoại lệ hay không. Ví dụ: bạn có thể có một tệp đang mở khi nhập vào khối và bạn cần đảm bảo rằng nó được đóng khi khối thoát.

Điều khoản đảm bảo chỉ làm điều này. Đảm bảo đi sau mệnh đề cứu hộ cuối cùng và chứa một đoạn mã sẽ luôn được thực thi khi khối kết thúc. Nó không quan trọng nếu các lối ra khối bình thường, nếu con người dâng và cứu một ngoại lệ, hoặc nếu nó bị chấm dứt bởi một ngoại lệ còn tự do, các đảm bảo khối sẽ được chạy.

Cú pháp

begin 
   #.. process 
   #..raise exception
rescue 
   #.. handle error 
ensure 
   #.. finally ensure execution
   #.. This will always execute.
end

Thí dụ

begin
   raise 'A test exception.'
rescue Exception => e
   puts e.message
   puts e.backtrace.inspect
ensure
   puts "Ensuring execution"
end

Điều này sẽ tạo ra kết quả sau:

A test exception.
["main.rb:4"]
Ensuring execution

Sử dụng câu lệnh khác

Nếu khác khoản hiện diện, nó đi sau khi cứu hộ điều khoản và trước khi bất kỳ đảm bảo .

Phần thân của một mệnh đề else chỉ được thực thi nếu phần thân chính của mã không có ngoại lệ nào.

Cú pháp

begin 
   #.. process 
   #..raise exception
rescue 
   # .. handle error
else
   #.. executes if there is no exception
ensure 
   #.. finally ensure execution
   #.. This will always execute.
end

Thí dụ

begin
   # raise 'A test exception.'
   puts "I'm not raising exception"
rescue Exception => e
   puts e.message
   puts e.backtrace.inspect
else
   puts "Congratulations-- no errors!"
ensure
   puts "Ensuring execution"
end

Điều này sẽ tạo ra kết quả sau:

I'm not raising exception
Congratulations-- no errors!
Ensuring execution

Có thể ghi lại thông báo lỗi tăng lên bằng cách sử dụng $! Biến đổi.

Bắt và ném

Mặc dù cơ chế ngoại lệ của nâng và cứu là tuyệt vời để bỏ thực thi khi có sự cố, đôi khi thật tuyệt khi có thể nhảy ra khỏi một số cấu trúc lồng nhau sâu trong quá trình xử lý bình thường. Đây là lúc bắt và ném có ích.

Lệnh bắt xác định một khối được gắn nhãn với tên đã cho (có thể là Biểu tượng hoặc Chuỗi). Khối được thực thi bình thường cho đến khi gặp một lần ném.

Cú pháp

throw :lablename
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end

OR

throw :lablename condition
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end

Thí dụ

Ví dụ sau sử dụng một cú ném để chấm dứt tương tác với người dùng nếu '!' được nhập để phản hồi lại bất kỳ lời nhắc nào.

def promptAndGet(prompt)
   print prompt
   res = readline.chomp
   throw :quitRequested if res == "!"
   return res
end

catch :quitRequested do
   name = promptAndGet("Name: ")
   age = promptAndGet("Age: ")
   sex = promptAndGet("Sex: ")
   # ..
   # process information
end
promptAndGet("Name:")

Bạn nên thử chương trình trên trên máy của mình vì nó cần tương tác thủ công. Điều này sẽ tạo ra kết quả sau:

Name: Ruby on Rails
Age: 3
Sex: !
Name:Just Ruby

Ngoại lệ lớp học

Các lớp và mô-đun tiêu chuẩn của Ruby nâng cao các ngoại lệ. Tất cả các lớp ngoại lệ tạo thành một hệ thống phân cấp, với lớp Ngoại lệ ở trên cùng. Cấp độ tiếp theo chứa bảy loại khác nhau -

  • Interrupt
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

Có một ngoại lệ khác ở cấp độ này, Fatal, nhưng trình thông dịch Ruby chỉ sử dụng nội bộ này.

Cả ScriptError và StandardError đều có một số lớp con, nhưng chúng ta không cần đi vào chi tiết ở đây. Điều quan trọng là nếu chúng ta tạo các lớp ngoại lệ của riêng mình, chúng cần phải là lớp con của lớp Exception hoặc một trong các lớp con của nó.

Hãy xem một ví dụ -

class FileSaveError < StandardError
   attr_reader :reason
   def initialize(reason)
      @reason = reason
   end
end

Bây giờ, hãy xem ví dụ sau, sẽ sử dụng ngoại lệ này:

File.open(path, "w") do |file|
begin
   # Write out the data ...
rescue
   # Something went wrong!
   raise FileSaveError.new($!)
end
end

Dòng quan trọng ở đây là tăng FileSaveError.new ($!) . Chúng tôi gọi raise để báo hiệu rằng một ngoại lệ đã xảy ra, chuyển nó một phiên bản mới của FileSaveError, với lý do là ngoại lệ cụ thể đó đã khiến việc ghi dữ liệu không thành công.

Ruby là một ngôn ngữ hướng đối tượng thuần túy và mọi thứ đều xuất hiện với Ruby dưới dạng một đối tượng. Mọi giá trị trong Ruby đều là một đối tượng, ngay cả những thứ nguyên thủy nhất: chuỗi, số và thậm chí là true và false. Ngay cả bản thân một lớp cũng là một đối tượng là một thể hiện của lớp Class . Chương này sẽ đưa bạn qua tất cả các chức năng chính liên quan đến Ruby hướng đối tượng.

Một lớp được sử dụng để chỉ định dạng của một đối tượng và nó kết hợp biểu diễn dữ liệu và các phương thức để thao tác dữ liệu đó thành một gói gọn gàng. Dữ liệu và phương thức trong một lớp được gọi là thành viên của lớp.

Định nghĩa lớp Ruby

Khi bạn xác định một lớp, bạn xác định một bản thiết kế cho một kiểu dữ liệu. Điều này không thực sự xác định bất kỳ dữ liệu nào, nhưng nó xác định ý nghĩa của tên lớp, nghĩa là, một đối tượng của lớp sẽ bao gồm những gì và những thao tác nào có thể được thực hiện trên một đối tượng như vậy.

Định nghĩa lớp bắt đầu bằng từ khóa class tiếp theo là class name và được phân định bằng một end. Ví dụ, chúng tôi đã định nghĩa lớp Box bằng cách sử dụng lớp từ khóa như sau:

class Box
   code
end

Tên phải bắt đầu bằng một chữ cái viết hoa và theo quy ước, các tên chứa nhiều hơn một từ được chạy cùng với mỗi từ được viết hoa và không có ký tự ngăn cách (CamelCase).

Xác định các đối tượng Ruby

Một lớp cung cấp bản thiết kế cho các đối tượng, vì vậy về cơ bản một đối tượng được tạo ra từ một lớp. Chúng tôi khai báo các đối tượng của một lớp bằng cách sử dụngnewtừ khóa. Các câu lệnh sau khai báo hai đối tượng của lớp Box:

box1 = Box.new
box2 = Box.new

Phương thức khởi tạo

Các initialize method là một phương thức lớp Ruby tiêu chuẩn và hoạt động gần giống như constructorhoạt động trong các ngôn ngữ lập trình hướng đối tượng khác. Phương thức khởi tạo hữu ích khi bạn muốn khởi tạo một số biến lớp tại thời điểm tạo đối tượng. Phương thức này có thể có một danh sách các tham số và giống như bất kỳ phương thức ruby ​​nào khác, nó sẽ có trướcdef từ khóa như hình bên dưới -

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
end

Các biến phiên bản

Các instance variableslà một loại thuộc tính của lớp và chúng trở thành thuộc tính của các đối tượng sau khi các đối tượng được tạo bằng cách sử dụng lớp. Mọi thuộc tính của đối tượng được gán riêng lẻ và không chia sẻ giá trị với các đối tượng khác. Chúng được truy cập bằng toán tử @ trong lớp nhưng để truy cập chúng bên ngoài lớp, chúng ta sử dụngpublic phương pháp, được gọi là accessor methods. Nếu chúng ta lấy lớp đã xác định ở trênBox thì @width và @height là các biến thể hiện cho Box lớp.

class Box
   def initialize(w,h)
      # assign instance variables
      @width, @height = w, h
   end
end

Phương thức truy cập & setter

Để làm cho các biến khả dụng từ bên ngoài lớp, chúng phải được định nghĩa bên trong accessor methods, các phương thức truy cập này còn được gọi là phương thức getter. Ví dụ sau đây cho thấy việc sử dụng các phương thức truy cập:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def printWidth
      @width
   end

   def printHeight
      @height
   end
end

# create an object
box = Box.new(10, 20)

# use accessor methods
x = box.printWidth()
y = box.printHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Width of the box is : 10
Height of the box is : 20

Tương tự như các phương thức của trình truy cập, được sử dụng để truy cập giá trị của các biến, Ruby cung cấp một cách để đặt giá trị của các biến đó từ bên ngoài lớp bằng cách sử dụng setter methods, được định nghĩa như sau:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# use setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Width of the box is : 30
Height of the box is : 50

Các phương thức phiên bản

Các instance methods cũng được định nghĩa theo cách tương tự như chúng tôi xác định bất kỳ phương pháp nào khác bằng cách sử dụng deftừ khóa và chúng chỉ có thể được sử dụng bằng một cá thể lớp như được hiển thị bên dưới. Chức năng của chúng không giới hạn trong việc truy cập các biến phiên bản mà còn có thể làm được nhiều việc hơn theo yêu cầu của bạn.

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Area of the box is : 200

Các phương thức và biến của lớp

Các class variableslà một biến, được chia sẻ giữa tất cả các trường hợp của một lớp. Nói cách khác, có một thể hiện của biến và nó được truy cập bởi các thể hiện đối tượng. Các biến lớp được bắt đầu bằng hai ký tự @ (@@). Một biến lớp phải được khởi tạo trong định nghĩa lớp như hình dưới đây.

Một phương thức lớp được định nghĩa bằng cách sử dụng def self.methodname(), kết thúc bằng dấu phân cách cuối và sẽ được gọi bằng tên lớp là classname.methodname như thể hiện trong ví dụ sau:

#!/usr/bin/ruby -w

class Box
   # Initialize our class variables
   @@count = 0
   def initialize(w,h)
      # assign instance avriables
      @width, @height = w, h

      @@count += 1
   end

   def self.printCount()
      puts "Box count is : #@@count"
   end
end

# create two object
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)

# call class method to print box count
Box.printCount()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Box count is : 2

Phương pháp to_s

Bất kỳ lớp nào bạn xác định phải có to_sphương thức thể hiện để trả về một biểu diễn chuỗi của đối tượng. Sau đây là một ví dụ đơn giản để đại diện cho một đối tượng Box theo chiều rộng và chiều cao:

#!/usr/bin/ruby -w

class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # define to_s method
   def to_s
      "(w:#@width,h:#@height)"  # string formatting of the object.
   end
end

# create an object
box = Box.new(10, 20)

# to_s method will be called in reference of string automatically.
puts "String representation of box is : #{box}"

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

String representation of box is : (w:10,h:20)

Kiểm soát truy cập

Ruby cung cấp cho bạn ba cấp độ bảo vệ ở cấp độ phương thức cá thể, có thể là public, private, or protected. Ruby không áp dụng bất kỳ kiểm soát truy cập nào đối với các biến cá thể và biến lớp.

  • Public Methods- Phương thức công khai có thể được gọi bởi bất kỳ ai. Các phương thức là công khai theo mặc định ngoại trừ khởi tạo, luôn là riêng tư.

  • Private Methods- Các phương thức riêng tư không thể được truy cập, hoặc thậm chí được xem từ bên ngoài lớp. Chỉ các phương thức của lớp mới có thể truy cập các thành viên riêng tư.

  • Protected Methods- Một phương thức được bảo vệ chỉ có thể được gọi bởi các đối tượng của lớp xác định và các lớp con của nó. Quyền truy cập được giữ trong gia đình.

Sau đây là một ví dụ đơn giản để hiển thị cú pháp của cả ba công cụ sửa đổi quyền truy cập:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method by default it is public
   def getArea
      getWidth() * getHeight
   end

   # define private accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end
   # make them private
   private :getWidth, :getHeight

   # instance method to print area
   def printArea
      @area = getWidth() * getHeight
      puts "Big box area is : #@area"
   end
   # make it protected
   protected :printArea
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"

# try to call protected or methods
box.printArea()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả như sau. Ở đây, phương pháp đầu tiên được gọi là thành công nhưng phương pháp thứ hai lại gặp sự cố.

Area of the box is : 200
test.rb:42: protected method `printArea' called for #
<Box:0xb7f11280 @height = 20, @width = 10> (NoMethodError)

Kế thừa giai cấp

Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là tính kế thừa. Tính kế thừa cho phép chúng ta định nghĩa một lớp theo nghĩa của một lớp khác, giúp tạo và duy trì một ứng dụng dễ dàng hơn.

Kế thừa cũng tạo cơ hội để sử dụng lại chức năng mã và thời gian thực hiện nhanh nhưng rất tiếc Ruby không hỗ trợ nhiều cấp độ kế thừa nhưng Ruby hỗ trợ mixins. Mixin giống như một triển khai chuyên biệt của đa kế thừa, trong đó chỉ phần giao diện được kế thừa.

Khi tạo một lớp, thay vì viết các thành viên dữ liệu hoàn toàn mới và các hàm thành viên, lập trình viên có thể chỉ định rằng lớp mới sẽ kế thừa các thành viên của một lớp hiện có. Lớp hiện có này được gọi làbase class or superclassvà lớp mới được gọi là derived class or sub-class.

Ruby cũng hỗ trợ khái niệm về phân lớp, tức là, kế thừa và ví dụ sau giải thích khái niệm này. Cú pháp để mở rộng một lớp rất đơn giản. Chỉ cần thêm ký tự <và tên của lớp cha vào câu lệnh lớp của bạn. Ví dụ, sau đây xác định một lớp BigBox là một lớp con của Box :

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox < Box

   # add a new instance method
   def printArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area
box.printArea()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Big box area is : 200

Ghi đè phương thức

Mặc dù bạn có thể thêm chức năng mới trong lớp dẫn xuất, nhưng đôi khi bạn muốn thay đổi hành vi của phương thức đã được xác định trong lớp cha. Bạn có thể làm như vậy đơn giản bằng cách giữ nguyên tên phương thức và ghi đè chức năng của phương thức như được hiển thị bên dưới trong ví dụ:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox < Box

   # change existing getArea method as follows
   def getArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area using overriden method.
box.getArea()

Người vận hành quá tải

Chúng tôi muốn toán tử + thực hiện phép cộng vectơ của hai đối tượng Hộp bằng cách sử dụng +, toán tử * để nhân chiều rộng và chiều cao của Hộp với một đại lượng vô hướng, và toán tử một ngôi để phủ định chiều rộng và chiều cao của Hộp. Đây là một phiên bản của lớp Box với các toán tử toán học được định nghĩa:

class Box
   def initialize(w,h)     # Initialize the width and height
      @width,@height = w, h
   end

   def +(other)       # Define + to do vector addition
      Box.new(@width + other.width, @height + other.height)
   end

   def -@           # Define unary minus to negate width and height
      Box.new(-@width, -@height)
   end

   def *(scalar)           # To perform scalar multiplication
      Box.new(@width*scalar, @height*scalar)
   end
end

Vật thể đóng băng

Đôi khi, chúng ta muốn ngăn một đối tượng bị thay đổi. Phương thức đóng băng trong Object cho phép chúng ta làm điều này, biến một đối tượng thành một hằng số một cách hiệu quả. Mọi đối tượng có thể bị đóng băng bằng cách gọiObject.freeze. Không thể sửa đổi một đối tượng cố định: bạn không thể thay đổi các biến phiên bản của nó.

Bạn có thể kiểm tra xem một đối tượng nhất định đã bị đóng băng hoặc không sử dụng Object.frozen?phương thức này trả về true trong trường hợp đối tượng bị đóng băng, nếu không giá trị false được trả về. Ví dụ sau làm rõ khái niệm -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# let us freez this object
box.freeze
if( box.frozen? )
   puts "Box object is frozen object"
else
   puts "Box object is normal object"
end

# now try using setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Box object is frozen object
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
   from test.rb:39

Hằng số lớp

Bạn có thể xác định một hằng số bên trong một lớp bằng cách gán giá trị số hoặc chuỗi trực tiếp cho một biến, giá trị này được xác định mà không sử dụng @ hoặc @@. Theo quy ước, chúng tôi giữ các tên không đổi bằng chữ hoa.

Khi một hằng số được xác định, bạn không thể thay đổi giá trị của nó nhưng bạn có thể truy cập trực tiếp vào hằng số bên trong một lớp giống như một biến nhưng nếu bạn muốn truy cập một hằng số bên ngoài lớp thì bạn phải sử dụng classname::constant như thể hiện trong ví dụ dưới đây.

#!/usr/bin/ruby -w

# define a class
class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Area of the box is : 200
TATA Inc
Box weight is: 10

Hằng số lớp được kế thừa và có thể bị ghi đè giống như các phương thức thể hiện.

Tạo đối tượng bằng cách sử dụng Allocate

Có thể có một tình huống khi bạn muốn tạo một đối tượng mà không gọi hàm tạo của nó initializetức là sử dụng phương thức mới, trong trường hợp đó, bạn có thể gọi phân bổ , điều này sẽ tạo một đối tượng chưa được khởi tạo cho bạn như trong ví dụ sau:

#!/usr/bin/ruby -w

# define a class
class Box
   attr_accessor :width, :height

   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method
   def getArea
      @width * @height
   end
end

# create an object using new
box1 = Box.new(10, 20)

# create another object using allocate
box2 = Box.allocate

# call instance method using box1
a = box1.getArea()
puts "Area of the box is : #{a}"

# call instance method using box2
a = box2.getArea()
puts "Area of the box is : #{a}"

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Area of the box is : 200
test.rb:14: warning: instance variable @width not initialized
test.rb:14: warning: instance variable @height not initialized
test.rb:14:in `getArea': undefined method `*' 
   for nil:NilClass (NoMethodError) from test.rb:29

Thông tin lớp học

Nếu các định nghĩa lớp là mã thực thi, điều này ngụ ý rằng chúng thực thi trong ngữ cảnh của một số đối tượng: self phải tham chiếu đến một cái gì đó. Hãy cùng tìm hiểu xem đó là gì.

#!/usr/bin/ruby -w

class Box
   # print class information
   puts "Type of self = #{self.type}"
   puts "Name of self = #{self.name}"
end

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Type of self = Class
Name of self = Box

Điều này có nghĩa là một định nghĩa lớp được thực thi với lớp đó là đối tượng hiện tại. Điều này có nghĩa là các phương thức trong siêu lớp và các lớp cha của nó sẽ có sẵn trong quá trình thực thi định nghĩa phương thức.

Một biểu thức chính quy là một chuỗi đặc biệt của nhân vật giúp bạn kết hợp hoặc tìm chuỗi khác hoặc bộ dây bằng cách sử dụng cú pháp chuyên tổ chức tại một mô hình.

Một chữ biểu thức chính quy là một mẫu giữa các dấu gạch chéo hoặc giữa các dấu phân cách tùy ý theo sau là% r như sau:

Cú pháp

/pattern/
/pattern/im    # option can be specified
%r!/usr/local! # general delimited regular expression

Thí dụ

#!/usr/bin/ruby

line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";

if ( line1 =~ /Cats(.*)/ )
   puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
   puts "Line2 contains  Dogs"
end

Điều này sẽ tạo ra kết quả sau:

Line1 contains Cats

Công cụ sửa đổi biểu thức chính quy

Các ký tự biểu thức chính quy có thể bao gồm một công cụ sửa đổi tùy chọn để kiểm soát các khía cạnh khác nhau của đối sánh. Công cụ sửa đổi được chỉ định sau ký tự gạch chéo thứ hai, như được hiển thị trước đó và có thể được đại diện bởi một trong các ký tự này -

Sr.No. Công cụ sửa đổi & mô tả
1

i

Bỏ qua chữ hoa khi khớp văn bản.

2

o

Thực hiện nội suy # {} chỉ một lần, lần đầu tiên ký tự regexp được đánh giá.

3

x

Bỏ qua khoảng trắng và cho phép nhận xét trong biểu thức chính quy.

4

m

Khớp nhiều dòng, nhận dạng các dòng mới là các ký tự bình thường.

5

u,e,s,n

Phiên dịch regexp dưới dạng Unicode (UTF-8), EUC, SJIS hoặc ASCII. Nếu không có công cụ sửa đổi nào trong số này được chỉ định, thì biểu thức chính quy được giả định sử dụng mã hóa nguồn.

Giống như các ký tự chuỗi được phân tách bằng% Q, Ruby cho phép bạn bắt đầu các biểu thức chính quy của mình với% r theo sau là dấu phân cách bạn chọn. Điều này rất hữu ích khi mẫu bạn đang mô tả có chứa nhiều ký tự gạch chéo mà bạn không muốn thoát ra -

# Following matches a single slash character, no escape required
%r|/|

# Flag characters are allowed with this syntax, too
%r[</(.*)>]i

Mẫu biểu thức chính quy

Ngoại trừ các ký tự điều khiển, (+ ? . * ^ $ ( ) [ ] { } | \), tất cả các ký tự đều khớp với nhau. Bạn có thể thoát một ký tự điều khiển bằng cách đặt trước nó một dấu gạch chéo ngược.

Sr.No. Mô hình & Mô tả
1

^

Đối sánh đầu dòng.

2

$

Đối sánh với cuối dòng.

3

.

Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới. Sử dụng tùy chọn m cũng cho phép nó khớp với dòng mới.

4

[...]

Khớp bất kỳ ký tự đơn nào trong ngoặc.

5

[^...]

Đối sánh bất kỳ ký tự đơn nào không có trong dấu ngoặc

6

re*

Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức trước.

7

re+

So khớp 1 hoặc nhiều lần xuất hiện của biểu thức trước.

số 8

re?

Khớp với 0 hoặc 1 lần xuất hiện của biểu thức trước.

9

re{ n}

Khớp chính xác n số lần xuất hiện của biểu thức trước.

10

re{ n,}

So khớp n hoặc nhiều lần xuất hiện của biểu thức trước.

11

re{ n, m}

Khớp ít nhất n và nhiều nhất m lần xuất hiện của biểu thức trước.

12

a| b

Đối sánh với a hoặc b.

13

(re)

Nhóm các biểu thức chính quy và ghi nhớ văn bản phù hợp.

14

(?imx)

Tạm thời chuyển đổi trên các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng.

15

(?-imx)

Tạm thời tắt các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng.

16

(?: re)

Nhóm các biểu thức chính quy mà không cần nhớ văn bản phù hợp.

17

(?imx: re)

Tạm thời chuyển đổi các tùy chọn i, m hoặc x trong dấu ngoặc đơn.

18

(?-imx: re)

Tạm thời tắt các tùy chọn i, m hoặc x trong dấu ngoặc đơn.

19

(?#...)

Bình luận.

20

(?= re)

Chỉ định vị trí bằng cách sử dụng một mẫu. Không có phạm vi.

21

(?! re)

Chỉ định vị trí bằng cách sử dụng phủ định mẫu. Không có phạm vi.

22

(?> re)

Khớp với mẫu độc lập mà không cần bẻ khóa ngược.

23

\w

Khớp các ký tự từ.

24

\W

Đối sánh các ký tự không phải từ khóa.

25

\s

Khớp khoảng trắng. Tương đương với [\ t \ n \ r \ f].

26

\S

Khớp với khoảng trắng.

27

\d

Khớp các chữ số. Tương đương với [0-9].

28

\D

Phù hợp với nondigits.

29

\A

Đối sánh với phần đầu của chuỗi.

30

\Z

Đối sánh với phần cuối của chuỗi. Nếu một dòng mới tồn tại, nó sẽ khớp ngay trước dòng mới.

31

\z

Đối sánh với phần cuối của chuỗi.

32

\G

Các trận đấu chỉ kết thúc trận đấu cuối cùng.

33

\b

Khớp các ranh giới từ khi nằm ngoài dấu ngoặc. Khớp với khoảng trắng lùi (0x08) khi bên trong dấu ngoặc.

34

\B

Khớp các ranh giới không phải từ.

35

\n, \t, etc.

Khớp với dòng mới, dấu xuống dòng, tab, v.v.

36

\1...\9

Đối sánh biểu thức con được nhóm thứ n.

37

\10

Đối sánh biểu thức con được nhóm thứ n nếu nó đã khớp. Mặt khác, đề cập đến biểu diễn bát phân của mã ký tự.

Ví dụ về Cụm từ Thông dụng

Sr.No. Ví dụ & Mô tả
1

/ruby/

Phù hợp với "ruby".

2

¥

Khớp Yến ký. Các ký tự Multibyte được hỗ trợ trong Ruby 1.9 và Ruby 1.8.

Sr.No. Ví dụ & Mô tả
1

/[Rr]uby/

Đối sánh với "Ruby" hoặc "ruby".

2

/rub[ye]/

Đối sánh với "ruby" hoặc "rube".

3

/[aeiou]/

Khớp với bất kỳ một nguyên âm chữ thường nào.

4

/[0-9]/

Khớp với bất kỳ chữ số nào; giống với / [0123456789] /.

5

/[a-z]/

Khớp với bất kỳ ký tự ASCII viết thường nào.

6

/[A-Z]/

Khớp với bất kỳ ký tự ASCII viết hoa nào.

7

/[a-zA-Z0-9]/

Phù hợp với bất kỳ điều nào ở trên.

số 8

/[^aeiou]/

Khớp với bất kỳ thứ gì khác ngoài một nguyên âm viết thường.

9

/[^0-9]/

Đối sánh với bất kỳ thứ gì khác ngoài một chữ số.

Sr.No. Ví dụ & Mô tả
1

/./

Khớp với bất kỳ ký tự nào ngoại trừ dòng mới.

2

/./m

Ở chế độ nhiều dòng, cũng khớp với dòng mới.

3

/\d/

Khớp một chữ số: / [0-9] /.

4

/\D/

Đối sánh với một không phải chữ số: / [^ 0-9] /.

5

/\s/

Khớp với một ký tự khoảng trắng: / [\ t \ r \ n \ f] /.

6

/\S/

Đối sánh không phải khoảng trắng: / [^ \ t \ r \ n \ f] /.

7

/\w/

Khớp một ký tự từ đơn: / [A-Za-z0-9 _] /.

số 8

/\W/

Khớp một ký tự không phải từ: / [^ A-Za-z0-9 _] /.

Sr.No. Ví dụ & Mô tả
1

/ruby?/

Đối sánh với "rub" hoặc "ruby": y là tùy chọn.

2

/ruby*/

Đối sánh "chà" cộng với 0 hoặc nhiều ys.

3

/ruby+/

Đối sánh "chà" cộng với 1 hoặc nhiều ys.

4

/\d{3}/

Khớp chính xác 3 chữ số.

5

/\d{3,}/

Khớp với 3 chữ số trở lên.

6

/\d{3,5}/

Đối sánh 3, 4 hoặc 5 chữ số.

Điều này phù hợp với số lần lặp lại nhỏ nhất -

Sr.No. Ví dụ & Mô tả
1

/<.*>/

Lặp lại tham lam: khớp với "<ruby> perl>".

2

/<.*?>/

Không tham lam: đối sánh "<ruby>" trong "<ruby> perl>".

Sr.No. Ví dụ & Mô tả
1

/\D\d+/

Không có nhóm: + lặp lại \ d

2

/(\D\d)+/

Đã nhóm: + lặp lại cặp \ D \ d

3

/([Rr]uby(, )?)+/

Đối sánh "Ruby", "Ruby, ruby, ruby", v.v.

Điều này khớp lại với một nhóm đã khớp trước đó -

Sr.No. Ví dụ & Mô tả
1

/([Rr])uby&\1ails/

Phù hợp với ruby ​​& rails hoặc Ruby & Rails.

2

/(['"])(?:(?!\1).)*\1/

Chuỗi được trích dẫn đơn hoặc kép. \ 1 đối sánh với bất kỳ thứ gì mà nhóm đầu tiên phù hợp. \ 2 đối sánh với bất kỳ thứ gì mà nhóm thứ 2 phù hợp, v.v.

Sr.No. Ví dụ & Mô tả
1

/ruby|rube/

Đối sánh với "ruby" hoặc "rube".

2

/rub(y|le))/

Đối sánh với "ruby" hoặc "rúp".

3

/ruby(!+|\?)/

"ruby" theo sau bởi một hoặc nhiều! hay một cái?

Nó cần xác định vị trí khớp.

Sr.No. Ví dụ & Mô tả
1

/^Ruby/

Đối sánh "Ruby" ở đầu chuỗi hoặc dòng nội bộ.

2

/Ruby$/

Đối sánh "Ruby" ở cuối một chuỗi hoặc dòng.

3

/\ARuby/

Đối sánh "Ruby" ở đầu chuỗi.

4

/Ruby\Z/

Đối sánh "Ruby" ở cuối một chuỗi.

5

/\bRuby\b/

Đối sánh "Ruby" ở một ranh giới từ.

6

/\brub\B/

\ B là ranh giới không phải từ: đối sánh "rub" trong "rube" và "ruby" nhưng không khớp với một mình.

7

/Ruby(?=!)/

Đối sánh với "Ruby", nếu theo sau là dấu chấm than.

số 8

/Ruby(?!!)/

Đối sánh với "Ruby", nếu không có dấu chấm than theo sau.

Sr.No. Ví dụ & Mô tả
1

/R(?#comment)/

Đối sánh với "R". Tất cả phần còn lại là một bình luận.

2

/R(?i)uby/

Không phân biệt chữ hoa chữ thường khi đối sánh "uby".

3

/R(?i:uby)/

Giống như trên.

4

/rub(?:y|le))/

Chỉ nhóm mà không tạo \ 1 backreference.

Tìm kiếm và Thay thế

Một số phương thức Chuỗi quan trọng nhất sử dụng biểu thức chính quy là subgsubvà các biến thể tại chỗ của chúng sub!gsub!.

Tất cả các phương pháp này thực hiện thao tác tìm kiếm và thay thế bằng cách sử dụng mẫu Regexp. Cácsub & sub! thay thế lần xuất hiện đầu tiên của mẫu và gsub & gsub! thay thế tất cả các lần xuất hiện.

Các subgsub trả về một chuỗi mới, để lại chuỗi ban đầu không được sửa đổi ở vị trí sub!gsub! sửa đổi chuỗi mà chúng được gọi.

Sau đây là ví dụ -

#!/usr/bin/ruby

phone = "2004-959-559 #This is Phone Number"

# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")   
puts "Phone Num : #{phone}"

# Remove anything other than digits
phone = phone.gsub!(/\D/, "")    
puts "Phone Num : #{phone}"

Điều này sẽ tạo ra kết quả sau:

Phone Num : 2004-959-559
Phone Num : 2004959559

Sau đây là một ví dụ khác -

#!/usr/bin/ruby

text = "rails are rails, really good Ruby on Rails"

# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")

# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"

Điều này sẽ tạo ra kết quả sau:

Rails are Rails, really good Ruby on Rails

Chương này hướng dẫn bạn cách truy cập cơ sở dữ liệu bằng Ruby. Các của Ruby DBI mô-đun cung cấp một giao diện cơ sở dữ liệu độc lập cho Ruby script tương tự như của các module Perl DBI.

DBI là viết tắt của Database Independent Interface for Ruby, có nghĩa là DBI cung cấp một lớp trừu tượng giữa mã Ruby và cơ sở dữ liệu bên dưới, cho phép bạn chuyển đổi triển khai cơ sở dữ liệu thực sự dễ dàng. Nó xác định một tập hợp các phương thức, biến và quy ước cung cấp giao diện cơ sở dữ liệu nhất quán, độc lập với cơ sở dữ liệu thực tế đang được sử dụng.

DBI có thể giao tiếp với những điều sau:

  • ADO (Đối tượng dữ liệu ActiveX)
  • DB2
  • Frontbase
  • mSQL
  • MySQL
  • ODBC
  • Oracle
  • OCI8 (Oracle)
  • PostgreSQL
  • Proxy/Server
  • SQLite
  • SQLRelay

Kiến trúc của một ứng dụng DBI

DBI độc lập với bất kỳ cơ sở dữ liệu nào có sẵn trong phần phụ trợ. Bạn có thể sử dụng DBI cho dù bạn đang làm việc với Oracle, MySQL hay Informix, v.v. Điều này rõ ràng từ sơ đồ kiến ​​trúc sau.

Kiến trúc chung cho Ruby DBI sử dụng hai lớp:

  • Lớp giao diện cơ sở dữ liệu (DBI). Lớp này độc lập với cơ sở dữ liệu và cung cấp một tập hợp các phương thức truy cập phổ biến được sử dụng theo cùng một cách bất kể loại máy chủ cơ sở dữ liệu mà bạn đang giao tiếp.

  • Lớp trình điều khiển cơ sở dữ liệu (DBD). Lớp này phụ thuộc vào cơ sở dữ liệu; các trình điều khiển khác nhau cung cấp quyền truy cập vào các công cụ cơ sở dữ liệu khác nhau. Có một trình điều khiển cho MySQL, một trình điều khiển khác cho PostgreSQL, một trình điều khiển khác cho InterBase, một trình điều khiển khác cho Oracle, v.v. Mỗi trình điều khiển diễn giải các yêu cầu từ lớp DBI và ánh xạ chúng thành các yêu cầu thích hợp cho một loại máy chủ cơ sở dữ liệu nhất định.

Điều kiện tiên quyết

Nếu bạn muốn viết các kịch bản Ruby để truy cập cơ sở dữ liệu MySQL, bạn sẽ cần phải cài đặt mô-đun Ruby MySQL.

Mô-đun này hoạt động như một DBD như đã giải thích ở trên và có thể được tải xuống từ https://www.tmtm.org/en/mysql/ruby/

Lấy và cài đặt Ruby / DBI

Bạn có thể tải xuống và cài đặt mô-đun Ruby DBI từ vị trí sau:

https://imgur.com/NFEuWe4/embed

Trước khi bắt đầu cài đặt này, hãy đảm bảo rằng bạn có đặc quyền root. Bây giờ, hãy làm theo các bước dưới đây -

Bước 1

$ tar zxf dbi-0.2.0.tar.gz

Bước 2

Đi đến thư mục phân phối dbi-0.2.0 và cấu hình nó bằng cách sử dụng tập lệnh setup.rb trong thư mục đó. Lệnh cấu hình chung nhất trông giống như thế này, không có đối số nào theo sau đối số config. Lệnh này cấu hình bản phân phối để cài đặt tất cả các trình điều khiển theo mặc định.

$ ruby setup.rb config

Để cụ thể hơn, hãy cung cấp tùy chọn - với tùy chọn liệt kê các phần cụ thể của bản phân phối mà bạn muốn sử dụng. Ví dụ: để chỉ định cấu hình mô-đun DBI chính và trình điều khiển cấp MySQL DBD, hãy phát hành lệnh sau:

$ ruby setup.rb config --with = dbi,dbd_mysql

Bước 3

Bước cuối cùng là xây dựng trình điều khiển và cài đặt nó bằng các lệnh sau:

$ ruby setup.rb setup $ ruby setup.rb install

Kết nối cơ sở dữ liệu

Giả sử chúng ta sẽ làm việc với cơ sở dữ liệu MySQL, trước khi kết nối với cơ sở dữ liệu, hãy đảm bảo những điều sau:

  • Bạn đã tạo một cơ sở dữ liệu TESTDB.

  • Bạn đã tạo EMPLOYEE trong TESTDB.

  • Bảng này có các trường FIRST_NAME, LAST_NAME, AGE, SEX và INCOME.

  • ID người dùng "testuser" và mật khẩu "test123" được đặt để truy cập TESTDB.

  • Ruby Module DBI được cài đặt đúng cách trên máy của bạn.

  • Bạn đã xem qua hướng dẫn MySQL để hiểu Cơ bản về MySQL.

Sau đây là ví dụ về kết nối với cơ sở dữ liệu MySQL "TESTDB"

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   # get server version string and display it
   row = dbh.select_one("SELECT VERSION()")
   puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Trong khi chạy tập lệnh này, nó tạo ra kết quả sau trên máy Linux của chúng tôi.

Server version: 5.0.45

Nếu kết nối được thiết lập với nguồn dữ liệu, thì Xử lý cơ sở dữ liệu sẽ được trả về và lưu vào dbh để sử dụng thêm dbhđược đặt thành giá trị nil và mã lỗi trả về e.erre :: errstr và một chuỗi lỗi tương ứng.

Cuối cùng, trước khi xuất bản, hãy đảm bảo rằng kết nối cơ sở dữ liệu đã được đóng và tài nguyên được giải phóng.

INSERT hoạt động

Thao tác INSERT là bắt buộc khi bạn muốn tạo bản ghi của mình vào một bảng cơ sở dữ liệu.

Khi kết nối cơ sở dữ liệu được thiết lập, chúng tôi sẵn sàng tạo bảng hoặc bản ghi vào bảng cơ sở dữ liệu bằng cách sử dụng do phương pháp hoặc prepareexecute phương pháp.

Sử dụng do Statement

Các câu lệnh không trả về hàng có thể được đưa ra bằng cách gọi dophương pháp xử lý cơ sở dữ liệu. Phương thức này nhận đối số chuỗi câu lệnh và trả về số lượng hàng bị ảnh hưởng bởi câu lệnh.

dbh.do("DROP TABLE IF EXISTS EMPLOYEE")
dbh.do("CREATE TABLE EMPLOYEE (
   FIRST_NAME  CHAR(20) NOT NULL,
   LAST_NAME  CHAR(20),
   AGE INT,  
   SEX CHAR(1),
   INCOME FLOAT )" );

Tương tự, bạn có thể thực thi câu lệnh SQL INSERT để tạo một bản ghi vào bảng EMPLOYEE.

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
      VALUES ('Mac', 'Mohan', 20, 'M', 2000)" )
   puts "Record has been created"
   dbh.commit
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Sử dụng chuẩn bị và thực thi

Bạn có thể sử dụng các phương thức chuẩn bịthực thi của lớp DBI để thực thi câu lệnh SQL thông qua mã Ruby.

Việc tạo bản ghi thực hiện theo các bước sau:

  • Chuẩn bị câu lệnh SQL với câu lệnh INSERT. Điều này sẽ được thực hiện bằng cách sử dụngprepare phương pháp.

  • Thực thi truy vấn SQL để chọn tất cả các kết quả từ cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute phương pháp.

  • Xử lý Báo cáo phát hành. Điều này sẽ được thực hiện bằng cách sử dụngfinish API

  • Nếu mọi thứ suôn sẻ, thì commit hoạt động này nếu không bạn có thể rollback giao dịch hoàn tất.

Sau đây là cú pháp để sử dụng hai phương pháp này:

sth = dbh.prepare(statement)
sth.execute
   ... zero or more SQL operations ...
sth.finish

Hai phương pháp này có thể được sử dụng để vượt qua bindgiá trị cho câu lệnh SQL. Có thể có một trường hợp khi các giá trị cần nhập không được cung cấp trước. Trong trường hợp này, các giá trị ràng buộc được sử dụng. Một dấu chấm hỏi (?) được sử dụng thay cho các giá trị thực và sau đó các giá trị thực tế được chuyển qua API execute ().

Sau đây là ví dụ để tạo hai bản ghi trong bảng EMPLOYEE -

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
      VALUES (?, ?, ?, ?, ?)" )
   sth.execute('John', 'Poul', 25, 'M', 2300)
   sth.execute('Zara', 'Ali', 17, 'F', 1000)
   sth.finish
   dbh.commit
   puts "Record has been created"
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Nếu có nhiều INSERT cùng một lúc, thì việc chuẩn bị một câu lệnh trước rồi thực thi nó nhiều lần trong một vòng lặp sẽ hiệu quả hơn việc gọi thực hiện mỗi lần trong vòng lặp.

ĐỌC hoạt động

ĐỌC Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là lấy một số thông tin hữu ích từ cơ sở dữ liệu.

Khi kết nối cơ sở dữ liệu của chúng tôi được thiết lập, chúng tôi đã sẵn sàng thực hiện truy vấn vào cơ sở dữ liệu này. Chúng ta có thể sử dụngdo phương pháp hoặc prepareexecute phương thức để tìm nạp các giá trị từ một bảng cơ sở dữ liệu.

Tìm nạp bản ghi thực hiện các bước sau:

  • Chuẩn bị truy vấn SQL dựa trên các điều kiện bắt buộc. Điều này sẽ được thực hiện bằng cách sử dụngprepare phương pháp.

  • Thực thi truy vấn SQL để chọn tất cả các kết quả từ cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute phương pháp.

  • Tìm nạp lần lượt tất cả các kết quả và in các kết quả đó. Điều này sẽ được thực hiện bằng cách sử dụngfetch phương pháp.

  • Xử lý Báo cáo phát hành. Điều này sẽ được thực hiện bằng cách sử dụngfinish phương pháp.

Sau đây là thủ tục để truy vấn tất cả các bản ghi từ bảng NHÂN VIÊN có mức lương hơn 1000.

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare("SELECT * FROM EMPLOYEE WHERE INCOME > ?")
   sth.execute(1000)

   sth.fetch do |row|
   printf "First Name: %s, Last Name : %s\n", row[0], row[1]
   printf "Age: %d, Sex : %s\n", row[2], row[3]
   printf "Salary :%d \n\n", row[4]
end
   sth.finish
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Điều này sẽ tạo ra kết quả sau:

First Name: Mac, Last Name : Mohan
Age: 20, Sex : M
Salary :2000

First Name: John, Last Name : Poul
Age: 25, Sex : M
Salary :2300

Có nhiều phương pháp rút gọn hơn để tìm nạp các bản ghi từ cơ sở dữ liệu. Nếu bạn quan tâm, hãy chuyển qua Tìm nạp kết quả, nếu không hãy chuyển sang phần tiếp theo.

Cập nhật hoạt động

CẬP NHẬT Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là cập nhật một hoặc nhiều bản ghi đã có sẵn trong cơ sở dữ liệu. Sau đây là thủ tục để cập nhật tất cả các bản ghi có SEX là 'M'. Ở đây, chúng tôi sẽ tăng TUỔI của tất cả nam giới thêm một năm. Điều này sẽ thực hiện ba bước -

  • Chuẩn bị truy vấn SQL dựa trên các điều kiện bắt buộc. Điều này sẽ được thực hiện bằng cách sử dụngprepare phương pháp.

  • Thực thi truy vấn SQL để chọn tất cả các kết quả từ cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute phương pháp.

  • Xử lý Báo cáo phát hành. Điều này sẽ được thực hiện bằng cách sử dụngfinish phương pháp.

  • Nếu mọi thứ suôn sẻ thì commit hoạt động này nếu không bạn có thể rollback giao dịch hoàn tất.

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ?")
   sth.execute('M')
   sth.finish
   dbh.commit
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Thao tác DELETE

Thao tác DELETE là bắt buộc khi bạn muốn xóa một số bản ghi khỏi cơ sở dữ liệu của mình. Sau đây là quy trình để xóa tất cả các bản ghi khỏi NHÂN VIÊN có TUỔI trên 20. Thao tác này sẽ thực hiện theo các bước sau.

  • Chuẩn bị truy vấn SQL dựa trên các điều kiện bắt buộc. Điều này sẽ được thực hiện bằng cách sử dụngprepare phương pháp.

  • Thực thi truy vấn SQL để xóa các bản ghi được yêu cầu khỏi cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute phương pháp.

  • Xử lý Báo cáo phát hành. Điều này sẽ được thực hiện bằng cách sử dụngfinish phương pháp.

  • Nếu mọi thứ suôn sẻ thì commit hoạt động này nếu không bạn có thể rollback giao dịch hoàn tất.

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare("DELETE FROM EMPLOYEE WHERE AGE > ?")
   sth.execute(20)
   sth.finish
   dbh.commit
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Thực hiện giao dịch

Giao dịch là một cơ chế đảm bảo tính nhất quán của dữ liệu. Các giao dịch phải có bốn thuộc tính sau:

  • Atomicity - Một giao dịch hoàn tất hoặc không có gì xảy ra cả.

  • Consistency - Một giao dịch phải bắt đầu ở trạng thái nhất quán và rời khỏi hệ thống là trạng thái nhất quán.

  • Isolation - Kết quả trung gian của một giao dịch không được hiển thị bên ngoài giao dịch hiện tại.

  • Durability - Một khi giao dịch đã được cam kết, các ảnh hưởng vẫn tồn tại, ngay cả sau khi hệ thống bị lỗi.

DBI cung cấp hai phương pháp để cam kết hoặc khôi phục một giao dịch. Có một phương pháp nữa được gọi là giao dịch có thể được sử dụng để thực hiện các giao dịch. Có hai cách tiếp cận đơn giản để thực hiện các giao dịch -

Tiếp cận tôi

Cách tiếp cận đầu tiên sử dụng các phương thức cam kếtkhôi phục của DBI để cam kết hoặc hủy bỏ giao dịch một cách rõ ràng -

dbh['AutoCommit'] = false # Set auto commit to false.
begin
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'")
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'")
   dbh.commit
rescue
   puts "transaction failed"
   dbh.rollback
end
dbh['AutoCommit'] = true

Phương pháp tiếp cận II

Cách tiếp cận thứ hai sử dụng phương pháp giao dịch . Điều này đơn giản hơn, vì nó cần một khối mã chứa các câu lệnh tạo nên giao dịch. Các giao dịch phương pháp thực hiện các khối, sau đó gọi cam kết hoặc rollback tự động, tuỳ thuộc vào việc các khối thành công hay thất bại -

dbh['AutoCommit'] = false # Set auto commit to false.
dbh.transaction do |dbh|
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'")
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'")
end
dbh['AutoCommit'] = true

Hoạt động CAM KẾT

Cam kết là hoạt động đưa ra một tín hiệu xanh cho cơ sở dữ liệu để hoàn thiện các thay đổi và sau hoạt động này, không thể hoàn nguyên thay đổi nào.

Đây là một ví dụ đơn giản để gọi commit phương pháp.

dbh.commit

Hoạt động ROLLBACK

Nếu bạn không hài lòng với một hoặc nhiều thay đổi và bạn muốn hoàn nguyên hoàn toàn những thay đổi đó, hãy sử dụng rollback phương pháp.

Đây là một ví dụ đơn giản để gọi rollback phương pháp.

dbh.rollback

Ngắt kết nối cơ sở dữ liệu

Để ngắt kết nối Cơ sở dữ liệu, hãy sử dụng API ngắt kết nối.

dbh.disconnect

Nếu người dùng đóng kết nối với cơ sở dữ liệu bằng phương pháp ngắt kết nối, thì mọi giao dịch chưa thanh toán sẽ được DBI khôi phục. Tuy nhiên, thay vì phụ thuộc vào bất kỳ chi tiết triển khai nào của DBI, ứng dụng của bạn tốt hơn nên gọi cam kết hoặc khôi phục một cách rõ ràng.

Xử lý lỗi

Có nhiều nguồn sai sót. Một vài ví dụ là lỗi cú pháp trong câu lệnh SQL được thực thi, lỗi kết nối hoặc gọi phương thức tìm nạp cho một xử lý câu lệnh đã bị hủy hoặc hoàn thành.

Nếu một phương pháp DBI không thành công, DBI sẽ đưa ra một ngoại lệ. Các phương thức DBI có thể nêu ra bất kỳ loại ngoại lệ nào nhưng hai lớp ngoại lệ quan trọng nhất là DBI :: InterfaceErrorDBI :: DatabaseError .

Đối tượng ngoại lệ của các lớp này có ba thuộc tính được đặt tên là err , errstrstate , đại diện cho số lỗi, chuỗi lỗi mô tả và mã lỗi chuẩn. Các thuộc tính được giải thích bên dưới -

  • err- Trả về biểu diễn số nguyên của lỗi đã xảy ra hoặc số không nếu điều này không được DBD hỗ trợ. Ví dụ: Oracle DBD trả về phần số của thông báo lỗi ORA-XXXX .

  • errstr - Trả về một biểu diễn chuỗi của lỗi đã xảy ra.

  • state- Trả về mã SQLSTATE của lỗi đã xảy ra. SQLSTATE là một chuỗi dài năm ký tự. Hầu hết các DBD không hỗ trợ điều này và thay vào đó trả về nil.

Bạn đã thấy đoạn mã sau ở trên trong hầu hết các ví dụ -

rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Để nhận thông tin gỡ lỗi về những gì tập lệnh của bạn đang làm khi nó thực thi, bạn có thể bật tính năng theo dõi. Để làm điều này, trước tiên bạn phải tải mô-đun dbi / trace và sau đó gọi phương thức theo dõi điều khiển chế độ theo dõi và điểm đến đầu ra -

require "dbi/trace"
..............

trace(mode, destination)

Giá trị chế độ có thể là 0 (tắt), 1, 2 hoặc 3 và đích phải là một đối tượng IO. Các giá trị mặc định tương ứng là 2 và STDERR.

Khối mã với các phương thức

Có một số phương pháp tạo xử lý. Các phương thức này có thể được gọi bằng một khối mã. Ưu điểm của việc sử dụng khối mã cùng với các phương thức là chúng cung cấp xử lý cho khối mã làm tham số của nó và tự động dọn dẹp xử lý khi khối kết thúc. Có rất ít ví dụ để hiểu khái niệm này.

  • DBI.connect- Phương thức này tạo ra một xử lý cơ sở dữ liệu và bạn nên gọi ngắt kết nối ở cuối khối để ngắt kết nối cơ sở dữ liệu.

  • dbh.prepare- Phương thức này tạo ra một câu lệnh xử lý và nó nên kết thúc ở cuối khối. Trong khối, bạn phải gọi thực hiện phương pháp để thực hiện báo cáo kết quả.

  • dbh.execute- Phương thức này cũng tương tự ngoại trừ việc chúng ta không cần gọi thực thi trong khối. Xử lý câu lệnh được thực hiện tự động.

ví dụ 1

DBI.connect có thể lấy một khối mã, chuyển xử lý cơ sở dữ liệu cho nó và tự động ngắt kết nối xử lý ở cuối khối như sau.

dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") do |dbh|

Ví dụ 2

dbh.prepare có thể lấy một khối mã, chuyển lệnh xử lý cho nó và tự động gọi kết thúc ở cuối khối như sau.

dbh.prepare("SHOW DATABASES") do |sth|
   sth.execute
   puts "Databases: " + sth.fetch_all.join(", ")
end

Ví dụ 3

dbh.execute có thể lấy một khối mã, chuyển xử lý câu lệnh cho nó và tự động gọi kết thúc ở cuối khối như sau:

dbh.execute("SHOW DATABASES") do |sth|
   puts "Databases: " + sth.fetch_all.join(", ")
end

Phương thức giao dịch DBI cũng sử dụng một khối mã đã được mô tả ở trên.

Các chức năng và thuộc tính dành riêng cho trình điều khiển

DBI cho phép trình điều khiển cơ sở dữ liệu cung cấp các chức năng bổ sung dành riêng cho cơ sở dữ liệu, người dùng có thể gọi hàm này thông qua phương thức func của bất kỳ đối tượng Handle nào.

Các thuộc tính dành riêng cho trình điều khiển được hỗ trợ và có thể được thiết lập hoặc nhận bằng cách sử dụng []= hoặc là [] các phương pháp.

Sr.No. Chức năng & Mô tả
1

dbh.func(:createdb, db_name)

Tạo cơ sở dữ liệu mới.

2

dbh.func(:dropdb, db_name)

Đánh rơi cơ sở dữ liệu.

3

dbh.func(:reload)

Thực hiện thao tác tải lại.

4

dbh.func(:shutdown)

Tắt máy chủ.

5

dbh.func(:insert_id) => Fixnum

Trả về giá trị AUTO_INCREMENT gần đây nhất cho kết nối.

6

dbh.func(:client_info) => String

Trả về thông tin máy khách MySQL theo phiên bản.

7

dbh.func(:client_version) => Fixnum

Trả về thông tin khách hàng về phiên bản. Nó tương tự như: client_info nhưng nó trả về một fixnum thay vì sting.

số 8

dbh.func(:host_info) => String

Trả về thông tin máy chủ.

9

dbh.func(:proto_info) => Fixnum

Trả về giao thức đang được sử dụng cho giao tiếp.

10

dbh.func(:server_info) => String

Trả về thông tin máy chủ MySQL theo phiên bản.

11

dbh.func(:stat) => String

Trả về trạng thái hiện tại của cơ sở dữ liệu.

12

dbh.func(:thread_id) => Fixnum

Trả về ID chủ đề hiện tại.

Thí dụ

#!/usr/bin/ruby

require "dbi"
begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") 
   puts dbh.func(:client_info)
   puts dbh.func(:client_version)
   puts dbh.func(:host_info)
   puts dbh.func(:proto_info)
   puts dbh.func(:server_info)
   puts dbh.func(:thread_id)
   puts dbh.func(:stat)
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   dbh.disconnect if dbh
end

Điều này sẽ tạo ra kết quả sau:

5.0.45
50045
Localhost via UNIX socket
10
5.0.45
150621
Uptime: 384981  Threads: 1  Questions: 1101078  Slow queries: 4 \
Opens: 324  Flush tables: 1  Open tables: 64  \
Queries per second avg: 2.860

Ruby là một ngôn ngữ có mục đích chung; nó hoàn toàn không thể được gọi là một ngôn ngữ web . Mặc dù vậy, các ứng dụng web và công cụ web nói chung là một trong những ứng dụng phổ biến nhất của Ruby.

Bạn không chỉ có thể viết máy chủ SMTP, FTP daemon hoặc máy chủ Web của riêng mình bằng Ruby mà còn có thể sử dụng Ruby cho các tác vụ thông thường hơn như lập trình CGI hoặc thay thế cho PHP.

Vui lòng dành vài phút với Hướng dẫn lập trình CGI để biết thêm chi tiết về Lập trình CGI.

Viết kịch bản CGI

Tập lệnh Ruby CGI cơ bản nhất trông như thế này:

#!/usr/bin/ruby

puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><body>This is a test</body></html>"

Nếu bạn gọi tập lệnh này là test.cgi và tải nó lên nhà cung cấp dịch vụ lưu trữ Web dựa trên Unix với các quyền phù hợp, bạn có thể sử dụng nó như một tập lệnh CGI.

Ví dụ, nếu bạn có trang Web https://www.example.com/được lưu trữ bằng nhà cung cấp dịch vụ lưu trữ Web Linux và bạn tải test.cgi lên thư mục chính và cấp cho nó quyền thực thi, sau đó truy cậphttps://www.example.com/test.cgi sẽ trả về một trang HTML nói rằng This is a test.

Tại đây khi test.cgi được yêu cầu từ trình duyệt Web, máy chủ Web sẽ tìm test.cgi trên trang Web, sau đó thực thi nó bằng trình thông dịch Ruby. Tập lệnh Ruby trả về một tiêu đề HTTP cơ bản và sau đó trả về một tài liệu HTML cơ bản.

Sử dụng cgi.rb

Ruby đi kèm với một thư viện đặc biệt có tên là cgi cho phép các tương tác phức tạp hơn những tương tác có tập lệnh CGI trước đó.

Hãy tạo một tập lệnh CGI cơ bản sử dụng cgi -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new

puts cgi.header
puts "<html><body>This is a test</body></html>"

Ở đây, bạn đã tạo một đối tượng CGI và sử dụng nó để in dòng tiêu đề cho bạn.

Xử lý biểu mẫu

Sử dụng lớp CGI cho phép bạn truy cập vào các tham số truy vấn HTML theo hai cách. Giả sử chúng ta được cung cấp một URL /cgi-bin/test.cgi?FirstName = Zara & LastName = Ali.

Bạn có thể truy cập trực tiếp các tham số FirstNameLastName bằng CGI # [] như sau:

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi['FirstName'] # =>  ["Zara"]
cgi['LastName']  # =>  ["Ali"]

Có một cách khác để truy cập các biến biểu mẫu này. Mã này sẽ cung cấp cho bạn một hàm băm của tất cả các khóa và giá trị -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
h = cgi.params  # =>  {"FirstName"=>["Zara"],"LastName"=>["Ali"]}
h['FirstName']  # =>  ["Zara"]
h['LastName']   # =>  ["Ali"]

Sau đây là mã để lấy tất cả các khóa -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi.keys         # =>  ["FirstName", "LastName"]

Nếu một biểu mẫu chứa nhiều trường có cùng tên, các giá trị tương ứng sẽ được trả về tập lệnh dưới dạng một mảng. Accessor [] chỉ trả về kết quả đầu tiên trong số this.index là kết quả của phương thức params để lấy tất cả chúng.

Trong ví dụ này, giả sử biểu mẫu có ba trường được gọi là "tên" và chúng tôi đã nhập ba tên "Zara", "Huma" và "Nuha" -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi['name']        # => "Zara"
cgi.params['name'] # => ["Zara", "Huma", "Nuha"]
cgi.keys           # => ["name"]
cgi.params         # => {"name"=>["Zara", "Huma", "Nuha"]}

Note- Ruby sẽ tự động xử lý các phương thức GET và POST. Không có cách điều trị riêng biệt cho hai phương pháp khác nhau này.

Một biểu mẫu được liên kết, nhưng cơ bản, có thể gửi dữ liệu chính xác sẽ có mã HTML như vậy -

<html>
   <body>
      <form method = "POST" action = "http://www.example.com/test.cgi">
         First Name :<input type = "text" name = "FirstName" value = "" />
         <br />
         Last Name :<input type = "text" name = "LastName" value = "" /> 
         <input type = "submit" value = "Submit Data" />
      </form>
   </body>
</html>

Tạo biểu mẫu và HTML

CGI chứa một số lượng lớn các phương pháp được sử dụng để tạo HTML. Bạn sẽ tìm thấy một phương pháp cho mỗi thẻ. Để kích hoạt các phương pháp này, bạn phải tạo một đối tượng CGI bằng cách gọi CGI.new.

Để làm cho việc lồng thẻ dễ dàng hơn, các phương pháp này lấy nội dung của chúng dưới dạng các khối mã. Các khối mã phải trả về một Chuỗi , chuỗi này sẽ được sử dụng làm nội dung cho thẻ. Ví dụ -

#!/usr/bin/ruby

require "cgi"
cgi = CGI.new("html4")
cgi.out {
   cgi.html {
      cgi.head { "\n"+cgi.title{"This Is a Test"} } +
      cgi.body { "\n"+
         cgi.form {"\n"+
            cgi.hr +
            cgi.h1 { "A Form: " } + "\n"+
            cgi.textarea("get_text") +"\n"+
            cgi.br +
            cgi.submit
         }
      }
   }
}

NOTE- Phương thức biểu mẫu của lớp CGI có thể chấp nhận một tham số phương thức, tham số này sẽ thiết lập phương thức HTTP (GET, POST, v.v.) được sử dụng trên biểu mẫu đệ trình. Mặc định, được sử dụng trong ví dụ này, là POST.

Điều này sẽ tạo ra kết quả sau:

Content-Type: text/html
Content-Length: 302

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Final//EN">

<HTML>
   <HEAD>
      <TITLE>This Is a Test</TITLE>
   </HEAD>
   <BODY>
      <FORM METHOD = "post" ENCTYPE = "application/x-www-form-urlencoded">
         <HR>
         <H1>A Form: </H1>
         <TEXTAREA COLS = "70" NAME = "get_text" ROWS = "10"></TEXTAREA>
         <BR>
         <INPUT TYPE = "submit">
      </FORM>
   </BODY>
</HTML>

Trích dẫn chuỗi

Khi xử lý URL và mã HTML, bạn phải cẩn thận trích dẫn các ký tự nhất định. Ví dụ: một ký tự gạch chéo (/) có ý nghĩa đặc biệt trong một URL, vì vậy nó phải làescaped nếu nó không phải là một phần của tên đường dẫn.

Ví dụ: bất kỳ / trong phần truy vấn của URL sẽ được dịch sang chuỗi% 2F và phải được dịch ngược lại thành a / để bạn sử dụng. Dấu cách và dấu và cũng là các ký tự đặc biệt. Để xử lý điều này, CGI cung cấp các quy trìnhCGI.escapeCGI.unescape.

#!/usr/bin/ruby

require 'cgi'
puts CGI.escape(Zara Ali/A Sweet & Sour Girl")

Điều này sẽ tạo ra kết quả sau:

Zara+Ali%2FA Sweet+%26+Sour+Girl")

#!/usr/bin/ruby

require 'cgi'
puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')

Điều này sẽ tạo ra kết quả sau:

&lt;h1&gt;Zara Ali/A Sweet & Sour Girl&lt;/h1&gt;'

Các phương pháp hữu ích trong lớp CGI

Đây là danh sách các phương thức liên quan đến lớp CGI -

  • Các của Ruby CGI - Phương pháp liên quan đến thư viện chuẩn CGI.

Cookie và phiên

Chúng tôi đã giải thích hai khái niệm này trong các phần khác nhau. Mời các bạn theo dõi các phần -

  • Các của Ruby CGI Cookies - Làm thế nào để xử lý Cookies CGI.

  • Các phiên CGI của Ruby - Cách quản lý các phiên CGI.

Máy chủ lưu trữ web

Bạn có thể kiểm tra chủ đề sau trên internet để lưu trữ trang web của mình trên Máy chủ dựa trên Unix -

  • Lưu trữ web dựa trên Unix

Simple Mail Transfer Protocol (SMTP) là một giao thức, xử lý việc gửi e-mail và định tuyến e-mail giữa các máy chủ thư.

Ruby cung cấp lớp Net :: SMTP cho kết nối phía máy khách Giao thức truyền thư đơn giản (SMTP) và cung cấp hai phương thức lớp mớibắt đầu .

  • Các new nhận hai tham số -

    • Tên máy chủ mặc định là localhost.

    • Số cổng mặc định là cổng 25 nổi tiếng.

  • Các start phương thức nhận các tham số này -

    • Máy chủ - tên IP của máy chủ SMTP, mặc định là localhost.

    • Các cổng - Số cổng, mặc định cho 25.

    • Các miền - Tên miền của người gửi mail, mặc định cho ENV [ "HOSTNAME"].

    • Các tài khoản - Tên đăng nhập, mặc định là con số không.

    • Các mật khẩu - mật khẩu tài khoản, mặc định cho nil.

    • Các AuthType - Cho Phép loại, mặc định cho cram_md5 .

Một đối tượng SMTP có một phương thức cá thể được gọi là sendmail, phương thức này thường sẽ được sử dụng để thực hiện công việc gửi thư. Nó có ba tham số -

  • Các nguồn - Một chuỗi hoặc mảng hoặc bất cứ điều gì với mỗi iterator trở về một chuỗi tại một thời điểm.

  • Người gửi - Một chuỗi sẽ xuất hiện trong trường từ của email.

  • Người nhận - Một chuỗi hoặc một mảng chuỗi đại diện cho (các) người nhận địa chỉ của người nhận.

Thí dụ

Đây là một cách đơn giản để gửi một email bằng Ruby script. Hãy thử một lần -

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
MESSAGE_END

Net::SMTP.start('localhost') do |smtp|
  smtp.send_message message, '[email protected]', '[email protected]'
end

Ở đây, bạn đã đặt một e-mail cơ bản trong tin nhắn, sử dụng một tài liệu, hãy chú ý định dạng tiêu đề một cách chính xác. E-mail yêu cầu mộtFrom, ToSubject tiêu đề, được ngăn cách với nội dung của e-mail bằng một dòng trống.

Để gửi thư, bạn sử dụng Net :: SMTP để kết nối với máy chủ SMTP trên máy cục bộ và sau đó sử dụng phương thức send_message cùng với thư, địa chỉ từ và địa chỉ đích dưới dạng các tham số (mặc dù địa chỉ từ và đến là trong chính e-mail, chúng không phải lúc nào cũng được sử dụng để định tuyến thư).

Nếu bạn không chạy máy chủ SMTP trên máy của mình, bạn có thể sử dụng Net :: SMTP để giao tiếp với máy chủ SMTP từ xa. Trừ khi bạn đang sử dụng dịch vụ email trực tuyến (chẳng hạn như Hotmail hoặc Yahoo! Mail), nhà cung cấp email của bạn sẽ cung cấp cho bạn thông tin chi tiết về máy chủ thư đi mà bạn có thể cung cấp cho Net :: SMTP, như sau:

Net::SMTP.start('mail.your-domain.com')

Dòng mã này kết nối với máy chủ SMTP trên cổng 25 của mail.your-domain.com mà không sử dụng bất kỳ tên người dùng hoặc mật khẩu nào. Tuy nhiên, nếu cần, bạn có thể chỉ định số cổng và các chi tiết khác. Ví dụ -

Net::SMTP.start('mail.your-domain.com', 
                25, 
                'localhost', 
                'username', 'password' :plain)

Ví dụ này kết nối với máy chủ SMTP tại mail.your-domain.com bằng tên người dùng và mật khẩu ở định dạng văn bản thuần túy. Nó xác định tên máy của khách hàng là localhost.

Gửi e-mail HTML bằng Ruby

Khi bạn gửi tin nhắn văn bản bằng Ruby thì tất cả nội dung sẽ được coi là văn bản đơn giản. Ngay cả khi bạn bao gồm các thẻ HTML trong một tin nhắn văn bản, nó sẽ được hiển thị dưới dạng văn bản đơn giản và các thẻ HTML sẽ không được định dạng theo cú pháp HTML. Nhưng Ruby Net :: SMTP cung cấp tùy chọn để gửi một tin nhắn HTML dưới dạng tin nhắn HTML thực tế.

Trong khi gửi email, bạn có thể chỉ định phiên bản Mime, loại nội dung và bộ ký tự để gửi email HTML.

Thí dụ

Sau đây là ví dụ để gửi nội dung HTML dưới dạng email. Hãy thử một lần -

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
MESSAGE_END

Net::SMTP.start('localhost') do |smtp|
   smtp.send_message message, '[email protected]', '[email protected]'
end

Gửi tệp đính kèm dưới dạng e-mail

Để gửi một email có nội dung hỗn hợp, yêu cầu đặt Content-type tiêu đề tới multipart/mixed. Sau đó, các phần văn bản và phần đính kèm có thể được chỉ định trongboundaries.

Ranh giới được bắt đầu bằng hai dấu gạch nối theo sau là một số duy nhất, số này không thể xuất hiện trong phần thư của email. Ranh giới cuối cùng biểu thị phần cuối cùng của email cũng phải kết thúc bằng hai dấu gạch nối.

Các tệp đính kèm phải được mã hóa bằng pack("m") có chức năng mã hóa base64 trước khi truyền.

Thí dụ

Sau đây là ví dụ, sẽ gửi một tệp /tmp/test.txt dưới dạng tệp đính kèm.

require 'net/smtp'

filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m")   # base64

marker = "AUNIQUEMARKER"
body = <<EOF
This is a test email to send an attachement.
EOF

# Define the main headers.
part1 = <<EOF
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary = #{marker}
--#{marker}
EOF

# Define the message action
part2 = <<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit

#{body}
--#{marker}
EOF

# Define the attachment section
part3 = <<EOF
Content-Type: multipart/mixed; name = \"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename = "#{filename}"

#{encodedcontent}
--#{marker}--
EOF

mailtext = part1 + part2 + part3

# Let's put our code in safe area
begin 
   Net::SMTP.start('localhost') do |smtp|
      smtp.sendmail(mailtext, '[email protected]', ['[email protected]'])
   end
rescue Exception => e  
   print "Exception occured: " + e  
end

NOTE - Bạn có thể chỉ định nhiều đích bên trong mảng nhưng chúng nên được phân tách bằng dấu phẩy.

Ruby cung cấp hai cấp độ truy cập vào các dịch vụ mạng. Ở cấp độ thấp, bạn có thể truy cập hỗ trợ socket cơ bản trong hệ điều hành cơ bản, cho phép bạn triển khai máy khách và máy chủ cho cả giao thức hướng kết nối và không kết nối.

Ruby cũng có các thư viện cung cấp quyền truy cập cấp cao hơn vào các giao thức mạng cấp ứng dụng cụ thể, chẳng hạn như FTP, HTTP, v.v.

Chương này cung cấp cho bạn sự hiểu biết về khái niệm nổi tiếng nhất trong Mạng - Lập trình Socket.

Sockets là gì?

Các ổ cắm là điểm cuối của một kênh truyền thông hai chiều. Sockets có thể giao tiếp trong một quy trình, giữa các quy trình trên cùng một máy hoặc giữa các quy trình trên các lục địa khác nhau.

Sockets có thể được triển khai trên một số loại kênh khác nhau: socket miền Unix, TCP, UDP, v.v. Các ổ cắm cung cấp các lớp cụ thể để xử lý các tàu vận tải thông thường cũng như một giao diện chung để xử lý phần còn lại.

Sockets có từ vựng riêng -

Sr.No. Thuật ngữ & Mô tả
1

domain

Họ các giao thức sẽ được sử dụng làm cơ chế vận chuyển. Các giá trị này là các hằng số như PF_INET, PF_UNIX, PF_X25, v.v.

2

type

Loại giao tiếp giữa hai điểm cuối, thường là SOCK_STREAM cho các giao thức hướng kết nối và SOCK_DGRAM cho các giao thức không kết nối.

3

protocol

Thông thường, giá trị này có thể được sử dụng để xác định một biến thể của giao thức trong một miền và loại.

4

hostname

Định danh của giao diện mạng -

Một chuỗi, có thể là tên máy chủ lưu trữ, địa chỉ tứ phân chấm hoặc địa chỉ IPV6 trong ký hiệu dấu hai chấm (và có thể là dấu chấm)

Chuỗi "<broadcast>", chỉ định địa chỉ INADDR_BROADCAST.

Một chuỗi có độ dài bằng 0, chỉ định INADDR_ANY hoặc

Số nguyên, được hiểu là địa chỉ nhị phân theo thứ tự byte máy chủ.

5

port

Mỗi máy chủ lắng nghe các máy khách gọi trên một hoặc nhiều cổng. Một cổng có thể là số cổng Fixnum, một chuỗi chứa số cổng hoặc tên của một dịch vụ.

Một khách hàng đơn giản

Ở đây chúng ta sẽ viết một chương trình khách rất đơn giản, chương trình này sẽ mở một kết nối đến một cổng nhất định và máy chủ nhất định. Lớp RubyTCPSocketcung cấp chức năng mở để mở một ổ cắm như vậy.

Các TCPSocket.open(hosname, port )mở kết nối TCP tới tên máy chủ trên cổng .

Khi bạn đã mở một ổ cắm, bạn có thể đọc từ đó giống như bất kỳ đối tượng IO nào. Khi hoàn tất, hãy nhớ đóng nó, vì bạn sẽ đóng một tệp.

Đoạn mã sau là một ứng dụng khách rất đơn giản kết nối với một máy chủ và cổng nhất định, đọc bất kỳ dữ liệu có sẵn nào từ ổ cắm, sau đó thoát ra -

require 'socket'        # Sockets are in standard library

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

while line = s.gets     # Read lines from the socket
   puts line.chop       # And print with platform line terminator
end
s.close                 # Close the socket when done

Một máy chủ đơn giản

Để viết máy chủ Internet, chúng tôi sử dụng TCPServerlớp học. Đối tượng TCPServer là một nhà máy cho các đối tượng TCPSocket.

Gọi ngay TCPServer.open(hostname, portchức năng chỉ định một cổng cho dịch vụ của bạn và tạoTCPServer vật.

Tiếp theo, gọi phương thức chấp nhận của đối tượng TCPServer được trả về. Phương thức này đợi cho đến khi một máy khách kết nối với cổng bạn đã chỉ định, rồi trả về một đối tượng TCPSocket đại diện cho kết nối với máy khách đó.

require 'socket'                 # Get sockets from stdlib

server = TCPServer.open(2000)    # Socket to listen on port 2000
loop {                           # Servers run forever
   client = server.accept        # Wait for a client to connect
   client.puts(Time.now.ctime)   # Send the time to the client
   client.puts "Closing the connection. Bye!"
   client.close                  # Disconnect from the client
}

Bây giờ, chạy máy chủ này ở chế độ nền và sau đó chạy ứng dụng khách trên để xem kết quả.

Máy chủ TCP đa máy khách

Hầu hết các máy chủ trên Internet được thiết kế để xử lý số lượng lớn khách hàng cùng một lúc.

Lớp Thread của Ruby giúp dễ dàng tạo một máy chủ đa luồng chấp nhận các yêu cầu và ngay lập tức tạo một luồng thực thi mới để xử lý kết nối trong khi vẫn cho phép chương trình chính chờ đợi nhiều kết nối hơn -

require 'socket'                 # Get sockets from stdlib

server = TCPServer.open(2000)    # Socket to listen on port 2000
loop {                           # Servers run forever
   Thread.start(server.accept) do |client|
   client.puts(Time.now.ctime)   # Send the time to the client
   client.puts "Closing the connection. Bye!"
   client.close                  # Disconnect from the client
   end
}

Trong ví dụ này, bạn có một vòng lặp vĩnh viễn và khi server.accept phản hồi, một luồng mới sẽ được tạo và bắt đầu ngay lập tức để xử lý kết nối vừa được chấp nhận, sử dụng đối tượng kết nối được chuyển vào luồng. Tuy nhiên, chương trình chính ngay lập tức lặp lại và chờ các kết nối mới.

Sử dụng các chuỗi Ruby theo cách này có nghĩa là mã có thể di động và sẽ chạy theo cách tương tự trên Linux, OS X và Windows.

Trình duyệt web nhỏ

Chúng ta có thể sử dụng thư viện socket để triển khai bất kỳ giao thức Internet nào. Ví dụ ở đây là một đoạn mã để tìm nạp nội dung của một trang web -

require 'socket'
 
host = 'www.tutorialspoint.com'     # The web server
port = 80                           # Default HTTP port
path = "/index.htm"                 # The file we want 

# This is the HTTP request we send to fetch a file
request = "GET #{path} HTTP/1.0\r\n\r\n"

socket = TCPSocket.open(host,port)  # Connect to server
socket.print(request)               # Send request
response = socket.read              # Read complete response
# Split response at first blank line into headers and body
headers,body = response.split("\r\n\r\n", 2) 
print body                          # And display it

Để triển khai ứng dụng khách web tương tự, bạn có thể sử dụng một thư viện được tạo sẵn như Net::HTTPđể làm việc với HTTP. Đây là mã tương đương với mã trước đó -

require 'net/http'                  # The library we need
host = 'www.tutorialspoint.com'     # The web server
path = '/index.htm'                 # The file we want 

http = Net::HTTP.new(host)          # Create a connection
headers, body = http.get(path)      # Request the file
if headers.code == "200"            # Check the status code   
   print body                        
else                                
   puts "#{headers.code} #{headers.message}" 
end

Vui lòng kiểm tra các thư viện tương tự để hoạt động với các giao thức FTP, SMTP, POP và IMAP.

Đọc thêm

Chúng tôi đã cung cấp cho bạn một khởi đầu nhanh về Lập trình Socket. Đây là một chủ đề lớn, vì vậy bạn nên xem qua Thư viện Ruby Socket và Phương thức lớp để tìm thêm chi tiết.

XML là gì?

Ngôn ngữ đánh dấu có thể mở rộng (XML) là một ngôn ngữ đánh dấu giống như HTML hoặc SGML. Điều này được khuyến nghị bởi World Wide Web Consortium và có sẵn như một tiêu chuẩn mở.

XML là một ngôn ngữ mã nguồn mở, di động cho phép các lập trình viên phát triển các ứng dụng mà các ứng dụng khác có thể đọc được, bất kể hệ điều hành và / hoặc ngôn ngữ phát triển.

XML cực kỳ hữu ích để theo dõi lượng dữ liệu vừa và nhỏ mà không yêu cầu xương sống dựa trên SQL.

Kiến trúc phân tích cú pháp XML và API

Có hai phiên bản khác nhau dành cho trình phân tích cú pháp XML -

  • SAX-like (Stream interfaces)- Tại đây bạn đăng ký các lệnh gọi lại cho các sự kiện quan tâm và sau đó để trình phân tích cú pháp tiến hành thông qua tài liệu. Điều này hữu ích khi tài liệu của bạn lớn hoặc bạn có giới hạn về bộ nhớ, nó phân tích cú pháp tệp khi đọc từ đĩa và toàn bộ tệp không bao giờ được lưu trữ trong bộ nhớ.

  • DOM-like (Object tree interfaces) - Đây là khuyến nghị của World Wide Web Consortium trong đó toàn bộ tệp được đọc vào bộ nhớ và được lưu trữ ở dạng phân cấp (dựa trên cây) để thể hiện tất cả các tính năng của tài liệu XML.

SAX rõ ràng không thể xử lý thông tin nhanh như DOM có thể khi làm việc với các tệp lớn. Mặt khác, việc sử dụng riêng DOM thực sự có thể giết chết tài nguyên của bạn, đặc biệt nếu được sử dụng trên nhiều tệp nhỏ.

SAX là chỉ đọc, trong khi DOM cho phép thay đổi tệp XML. Vì hai API khác nhau này thực sự bổ sung cho nhau nên không có lý do gì bạn không thể sử dụng cả hai cho các dự án lớn.

Phân tích cú pháp và tạo XML bằng Ruby

Cách phổ biến nhất để thao tác với XML là sử dụng thư viện REXML của Sean Russell. Kể từ năm 2002, REXML đã là một phần của bản phân phối Ruby tiêu chuẩn.

REXML là một bộ xử lý XML thuần Ruby phù hợp với tiêu chuẩn XML 1.0. Nó là một bộ xử lý không xác thực , vượt qua tất cả các bài kiểm tra sự phù hợp không xác thực của OASIS.

Trình phân tích cú pháp REXML có những ưu điểm sau so với các trình phân tích cú pháp có sẵn khác:

  • Nó được viết 100 phần trăm bằng Ruby.
  • Nó có thể được sử dụng cho cả phân tích cú pháp SAX và DOM.
  • Nó có dung lượng nhẹ, ít hơn 2000 dòng mã.
  • Các phương thức và lớp học thực sự dễ hiểu.
  • API dựa trên SAX2 và hỗ trợ Full XPath.
  • Được vận chuyển với cài đặt Ruby và không cần cài đặt riêng.

Đối với tất cả các ví dụ về mã XML của chúng tôi, hãy sử dụng một tệp XML đơn giản làm đầu vào -

<collection shelf = "New Arrivals">
   <movie title = "Enemy Behind">
      <type>War, Thriller</type>
      <format>DVD</format>
      <year>2003</year>
      <rating>PG</rating>
      <stars>10</stars>
      <description>Talk about a US-Japan war</description>
   </movie>
   <movie title = "Transformers">
      <type>Anime, Science Fiction</type>
      <format>DVD</format>
      <year>1989</year>
      <rating>R</rating>
      <stars>8</stars>
      <description>A schientific fiction</description>
   </movie>
   <movie title = "Trigun">
      <type>Anime, Action</type>
      <format>DVD</format>
      <episodes>4</episodes>
      <rating>PG</rating>
      <stars>10</stars>
      <description>Vash the Stampede!</description>
   </movie>
   <movie title = "Ishtar">
      <type>Comedy</type>
      <format>VHS</format>
      <rating>PG</rating>
      <stars>2</stars>
      <description>Viewable boredom</description>
   </movie>
</collection>

Phân tích cú pháp giống DOM

Trước tiên, hãy phân tích cú pháp dữ liệu XML của chúng ta theo kiểu cây . Chúng tôi bắt đầu bằng cách yêu cầurexml/documentthư viện; thường chúng tôi thực hiện một REXML bao gồm để nhập vào không gian tên cấp cao nhất cho thuận tiện.

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# Now get the root element
root = xmldoc.root
puts "Root element : " + root.attributes["shelf"]

# This will output all the movie titles.
xmldoc.elements.each("collection/movie"){ 
   |e| puts "Movie Title : " + e.attributes["title"] 
}

# This will output all the movie types.
xmldoc.elements.each("collection/movie/type") {
   |e| puts "Movie Type : " + e.text 
}

# This will output all the movie description.
xmldoc.elements.each("collection/movie/description") {
   |e| puts "Movie Description : " + e.text 
}

Điều này sẽ tạo ra kết quả sau:

Root element : New Arrivals
Movie Title : Enemy Behind
Movie Title : Transformers
Movie Title : Trigun
Movie Title : Ishtar
Movie Type : War, Thriller
Movie Type : Anime, Science Fiction
Movie Type : Anime, Action
Movie Type : Comedy
Movie Description : Talk about a US-Japan war
Movie Description : A schientific fiction
Movie Description : Vash the Stampede!
Movie Description : Viewable boredom

Phân tích cú pháp giống SAX

Để xử lý cùng một dữ liệu, movies.xml , tệp theo cách hướng dòng, chúng ta sẽ định nghĩa một lớp lắng nghe có các phương thức sẽ là mục tiêu của các lệnh gọi lại từ trình phân tích cú pháp.

NOTE - Không nên sử dụng phân tích cú pháp giống SAX cho một tệp nhỏ, đây chỉ là một ví dụ demo.

#!/usr/bin/ruby -w

require 'rexml/document'
require 'rexml/streamlistener'
include REXML

class MyListener
   include REXML::StreamListener
   def tag_start(*args)
      puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"
   end

   def text(data)
      return if data =~ /^\w*$/     # whitespace only
      abbrev = data[0..40] + (data.length > 40 ? "..." : "")
      puts "  text   :   #{abbrev.inspect}"
   end
end

list = MyListener.new
xmlfile = File.new("movies.xml")
Document.parse_stream(xmlfile, list)

Điều này sẽ tạo ra kết quả sau:

tag_start: "collection", {"shelf"=>"New Arrivals"}
tag_start: "movie", {"title"=>"Enemy Behind"}
tag_start: "type", {}
   text   :   "War, Thriller"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "Talk about a US-Japan war"
tag_start: "movie", {"title"=>"Transformers"}
tag_start: "type", {}
   text   :   "Anime, Science Fiction"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "A schientific fiction"
tag_start: "movie", {"title"=>"Trigun"}
tag_start: "type", {}
   text   :   "Anime, Action"
tag_start: "format", {}
tag_start: "episodes", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "Vash the Stampede!"
tag_start: "movie", {"title"=>"Ishtar"}
tag_start: "type", {}
tag_start: "format", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "Viewable boredom"

XPath và Ruby

Một cách khác để xem XML là XPath. Đây là một loại ngôn ngữ giả mô tả cách định vị các phần tử và thuộc tính cụ thể trong một tài liệu XML, coi tài liệu đó như một cây có thứ tự logic.

REXML có hỗ trợ XPath thông qua lớp XPath . Nó giả định phân tích cú pháp dựa trên cây (mô hình đối tượng tài liệu) như chúng ta đã thấy ở trên.

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# Info for the first movie found
movie = XPath.first(xmldoc, "//movie")
p movie

# Print out all the movie types
XPath.each(xmldoc, "//type") { |e| puts e.text }

# Get an array of all of the movie formats.
names = XPath.match(xmldoc, "//format").map {|x| x.text }
p names

Điều này sẽ tạo ra kết quả sau:

<movie title = 'Enemy Behind'> ... </>
War, Thriller
Anime, Science Fiction
Anime, Action
Comedy
["DVD", "DVD", "DVD", "VHS"]

XSLT và Ruby

Có hai trình phân tích cú pháp XSLT có sẵn mà Ruby có thể sử dụng. Một mô tả ngắn gọn của mỗi được đưa ra ở đây

Ruby-Sablotron

Trình phân tích cú pháp này được viết và duy trì bởi Masayoshi Takahashi. Điều này được viết chủ yếu cho hệ điều hành Linux và yêu cầu các thư viện sau:

  • Sablot
  • Iconv
  • Expat

Bạn có thể tìm thấy mô-đun này tại Ruby-Sablotron.

XSLT4R

XSLT4R được viết bởi Michael Neumann và có thể được tìm thấy tại RAA trong phần Thư viện dưới XML. XSLT4R sử dụng giao diện dòng lệnh đơn giản, mặc dù nó có thể được sử dụng trong ứng dụng của bên thứ ba để chuyển đổi tài liệu XML.

XSLT4R cần XMLScan để hoạt động, được bao gồm trong kho lưu trữ XSLT4R và cũng là một mô-đun Ruby 100%. Các mô-đun này có thể được cài đặt bằng phương pháp cài đặt Ruby tiêu chuẩn (tức là ruby ​​install.rb).

XSLT4R có cú pháp sau:

ruby xslt.rb stylesheet.xsl document.xml [arguments]

Nếu bạn muốn sử dụng XSLT4R từ bên trong ứng dụng, bạn có thể bao gồm XSLT và nhập các tham số bạn cần. Đây là ví dụ -

require "xslt"

stylesheet = File.readlines("stylesheet.xsl").to_s
xml_doc = File.readlines("document.xml").to_s
arguments = { 'image_dir' => '/....' }
sheet = XSLT::Stylesheet.new( stylesheet, arguments )

# output to StdOut
sheet.apply( xml_doc )

# output to 'str'
str = ""
sheet.output = [ str ]
sheet.apply( xml_doc )

Đọc thêm

  • Để biết chi tiết đầy đủ về Trình phân tích cú pháp REXML, vui lòng tham khảo tài liệu tiêu chuẩn cho Tài liệu về Trình phân tích cú pháp REXML .

  • Bạn có thể tải xuống XSLT4R từ Kho lưu trữ RAA .

SOAP là gì?

Giao thức truy cập đối tượng đơn giản (SOAP), là một giao thức RPC đa nền tảng và độc lập với ngôn ngữ dựa trên XML và thường là (nhưng không nhất thiết) HTTP.

Nó sử dụng XML để mã hóa thông tin thực hiện cuộc gọi thủ tục từ xa và HTTP để vận chuyển thông tin đó qua mạng từ máy khách đến máy chủ và ngược lại.

SOAP có một số lợi thế so với các công nghệ khác như COM, CORBA, v.v.: ví dụ, chi phí triển khai và gỡ lỗi tương đối rẻ, khả năng mở rộng và dễ sử dụng, và sự tồn tại của một số triển khai cho các ngôn ngữ và nền tảng khác nhau.

Vui lòng tham khảo SOAP hướng dẫn đơn giản của chúng tôi để hiểu chi tiết.

Chương này giúp bạn làm quen với việc triển khai SOAP cho Ruby (SOAP4R). Đây là một hướng dẫn cơ bản, vì vậy nếu bạn cần chi tiết sâu hơn, bạn sẽ cần tham khảo các nguồn khác.

Cài đặt SOAP4R

SOAP4R là triển khai SOAP cho Ruby do Hiroshi Nakamura phát triển và có thể tải xuống từ -

NOTE - Có thể có nhiều khả năng là bạn đã cài đặt thành phần này.

Download SOAP

Nếu bạn biết về gem thì bạn có thể sử dụng lệnh sau để cài đặt SOAP4R và các gói liên quan.

$ gem install soap4r --include-dependencies

Nếu bạn đang làm việc trên Windows, thì bạn cần tải xuống tệp nén từ vị trí trên và cần cài đặt nó bằng phương pháp cài đặt tiêu chuẩn bằng cách chạy ruby install.rb .

Viết máy chủ SOAP4R

SOAP4R hỗ trợ hai loại máy chủ khác nhau -

  • Dựa trên CGI / FastCGI (SOAP :: RPC :: CGIStub)
  • Độc lập (SOAP :: RPC: StandaloneServer)

Chương này cung cấp chi tiết về cách viết một máy chủ độc lập. Các bước sau đây liên quan đến việc viết một máy chủ SOAP.

Bước 1 - Kế thừa SOAP :: RPC :: Lớp máy chủ độc lập

Để triển khai máy chủ độc lập của riêng bạn, bạn cần viết một lớp mới, lớp này sẽ là con của SOAP :: StandaloneServer như sau:

class MyServer < SOAP::RPC::StandaloneServer
  ...............
end

NOTE- Nếu bạn muốn viết một máy chủ dựa trên FastCGI thì bạn cần lấy SOAP :: RPC :: CGIStub làm lớp cha, phần còn lại của thủ tục sẽ giữ nguyên.

Bước 2 - Xác định phương thức xử lý

Bước thứ hai là viết các phương thức Dịch vụ Web của bạn mà bạn muốn đưa ra thế giới bên ngoài.

Chúng có thể được viết dưới dạng các phương thức Ruby đơn giản. Ví dụ, hãy viết hai phương pháp để cộng hai số và chia hai số -

class MyServer < SOAP::RPC::StandaloneServer
   ...............

   # Handler methods
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

Bước 3 - Phơi bày các phương pháp xử lý

Bước tiếp theo là thêm các phương thức đã xác định của chúng tôi vào máy chủ của chúng tôi. Các initialize phương pháp được sử dụng để tiếp xúc với các phương pháp dịch vụ với một trong hai phương pháp sau đây -

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, methodName, *paramArg)
   end
end

Đây là mô tả của các tham số -

Sr.No. Mô tả về Thông Số
1

receiver

Đối tượng chứa phương thức methodName. Bạn xác định các phương thức dịch vụ trong cùng một lớp với phương thức methodDef, tham số này là chính nó .

2

methodName

Tên của phương thức được gọi do một yêu cầu RPC.

3

paramArg

Chỉ định, khi đã cho, tên tham số và chế độ tham số.

Để hiểu cách sử dụng các tham số inout hoặc out , hãy xem xét phương thức dịch vụ sau đây có hai tham số (inParam và inoutParam), trả về một giá trị trả về bình thường (retVal) và hai tham số khác: inoutParamoutParam -

def aMeth(inParam, inoutParam)
   retVal = inParam + inoutParam
   outParam = inParam . inoutParam
   inoutParam = inParam * inoutParam
   return retVal, inoutParam, outParam
end

Bây giờ, chúng ta có thể trình bày phương pháp này như sau:

add_method(self, 'aMeth', [
   %w(in inParam),
   %w(inout inoutParam),
   %w(out outParam),
   %w(retval return)
])

Bước 4 - Khởi động máy chủ

Bước cuối cùng là khởi động máy chủ của bạn bằng cách khởi tạo một phiên bản của lớp dẫn xuất và gọi start phương pháp.

myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)

myServer.start

Đây là mô tả của các tham số bắt buộc -

Sr.No. Mô tả về Thông Số
1

ServerName

Tên máy chủ, bạn có thể đặt những gì bạn thích nhất.

2

urn:ruby:ServiceName

Ở đây urn: ruby là không đổi nhưng bạn có thể đặt tên ServiceName duy nhất cho máy chủ này.

3

hostname

Chỉ định tên máy chủ mà máy chủ này sẽ lắng nghe.

4

port

Số cổng khả dụng sẽ được sử dụng cho dịch vụ web.

Thí dụ

Bây giờ, bằng cách sử dụng các bước trên, chúng ta hãy viết một máy chủ độc lập -

require "soap/rpc/standaloneserver"

begin
   class MyServer < SOAP::RPC::StandaloneServer

      # Expose our services
      def initialize(*args)
         add_method(self, 'add', 'a', 'b')
         add_method(self, 'div', 'a', 'b')
      end

      # Handler methods
      def add(a, b)
         return a + b
      end
      def div(a, b) 
         return a / b 
      end
end
   server = MyServer.new("MyServer", 
            'urn:ruby:calculation', 'localhost', 8080)
   trap('INT){
      server.shutdown
   }
   server.start
rescue => err
   puts err.message
end

Khi được thực thi, ứng dụng máy chủ này khởi động một máy chủ SOAP độc lập trên localhost và lắng nghe các yêu cầu trên cổng 8080. Nó hiển thị một phương thức dịch vụ, thêmdiv , nhận hai tham số và trả về kết quả.

Bây giờ, bạn có thể chạy máy chủ này ở chế độ nền như sau:

$ ruby MyServer.rb&

Viết khách hàng SOAP4R

Lớp SOAP :: RPC :: Driver cung cấp hỗ trợ viết các ứng dụng khách SOAP. Chương này mô tả lớp này và trình bày cách sử dụng của nó trên cơ sở một ứng dụng.

Sau đây là thông tin tối thiểu mà bạn cần để gọi dịch vụ SOAP -

  • URL của dịch vụ SOAP (URL điểm cuối SOAP).
  • Không gian tên của các phương thức dịch vụ (URI không gian tên phương thức).
  • Tên của các phương thức dịch vụ và các tham số của chúng.

Bây giờ, chúng ta sẽ viết một ứng dụng khách SOAP sẽ gọi các phương thức dịch vụ được định nghĩa trong ví dụ trên, có tên là adddiv .

Dưới đây là các bước chính để tạo một ứng dụng khách SOAP.

Bước 1 - Tạo phiên bản trình điều khiển SOAP

Chúng tôi tạo một phiên bản của SOAP :: RPC :: Driver bằng cách gọi phương thức mới của nó như sau:

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

Đây là mô tả của các tham số bắt buộc -

Sr.No. Mô tả về Thông Số
1

endPoint

URL của máy chủ SOAP để kết nối.

2

nameSpace

Không gian tên để sử dụng cho tất cả các RPC được thực hiện với đối tượng SOAP :: RPC :: Driver này.

3

soapAction

Một giá trị cho trường SOAPAction của tiêu đề HTTP. Nếu nil, giá trị này mặc định là chuỗi rỗng "".

Bước 2 - Thêm phương thức dịch vụ

Để thêm phương thức dịch vụ SOAP vào SOAP :: RPC :: Driver, chúng ta có thể gọi phương thức sau bằng cách sử dụng SOAP :: RPC :: Driver instance -

driver.add_method(name, *paramArg)

Đây là mô tả của các tham số -

Sr.No. Mô tả về Thông Số
1

name

Tên của phương thức dịch vụ web từ xa.

2

paramArg

Chỉ định tên của các tham số của thủ tục từ xa.

Bước 3 - Gọi dịch vụ SOAP

Bước cuối cùng là lập hóa đơn dịch vụ SOAP bằng cách sử dụng SOAP :: RPC :: Driver instance như sau:

result = driver.serviceMethod(paramArg...)

Ở đây serviceMethod là phương thức dịch vụ web thực tế và paramArg ... là danh sách các tham số bắt buộc phải chuyển trong phương thức dịch vụ.

Example

Dựa trên các bước trên, chúng tôi sẽ viết một ứng dụng khách SOAP như sau:

#!/usr/bin/ruby -w

require 'soap/rpc/driver'

NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost:8080/'

begin
   driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
   
   # Add remote sevice methods
   driver.add_method('add', 'a', 'b')

   # Call remote service methods
   puts driver.add(20, 30)
rescue => err
   puts err.message
end

Đọc thêm

Tôi đã giải thích cho bạn những khái niệm rất cơ bản về Dịch vụ Web với Ruby. Nếu bạn muốn đi sâu hơn, thì có liên kết sau để tìm thêm chi tiết về Dịch vụ web với Ruby .

Giới thiệu

Giao diện người dùng đồ họa tiêu chuẩn (GUI) cho Ruby là Tk. Tk khởi đầu là GUI cho ngôn ngữ kịch bản Tcl do John Ousterhout phát triển.

Tk có điểm khác biệt duy nhất là GUI đa nền tảng duy nhất. Tk chạy trên Windows, Mac và Linux và cung cấp giao diện gốc trên mỗi hệ điều hành.

Thành phần cơ bản của ứng dụng dựa trên Tk được gọi là widget. Một thành phần đôi khi cũng được gọi là cửa sổ, vì trong Tk, "cửa sổ" và "tiện ích con" thường được sử dụng thay thế cho nhau.

Các ứng dụng Tk tuân theo một hệ thống phân cấp tiện ích trong đó bất kỳ số lượng tiện ích nào có thể được đặt trong một tiện ích con khác và những tiện ích con đó trong một tiện ích con khác, quảng cáo trong nội bộ Tiện ích chính trong chương trình Tk được gọi là tiện ích gốc và có thể được tạo bằng cách tạo một phiên bản mới của lớp TkRoot.

  • Hầu hết các ứng dụng dựa trên Tk đều tuân theo cùng một chu trình: tạo các widget, đặt chúng vào giao diện và cuối cùng, liên kết các sự kiện liên quan đến từng widget với một phương thức.

  • Có ba nhà quản lý hình học; đặt, lướigói chịu trách nhiệm kiểm soát kích thước và vị trí của từng tiện ích con trong giao diện.

Cài đặt

Các ràng buộc Ruby Tk được phân phối cùng với Ruby nhưng Tk là một cài đặt riêng biệt. Người dùng Windows có thể tải xuống bản cài đặt Tk bằng một cú nhấp chuột từ ActiveTcl của ActiveState .

Người dùng Mac và Linux có thể không cần cài đặt nó vì rất có thể nó đã được cài đặt cùng với OS nhưng nếu không, bạn có thể tải xuống các gói dựng sẵn hoặc lấy nguồn từ Tcl Developer Xchange .

Ứng dụng Tk đơn giản

Một cấu trúc điển hình cho các chương trình Ruby / Tk là tạo chính hoặc root cửa sổ (một phiên bản của TkRoot), thêm các widget vào đó để xây dựng giao diện người dùng, sau đó bắt đầu vòng lặp sự kiện chính bằng cách gọi Tk.mainloop.

Các truyền thống Hello, World! ví dụ cho Ruby / Tk trông giống như thế này -

require 'tk'

root = TkRoot.new { title "Hello, World!" }
TkLabel.new(root) do
   text 'Hello, World!'
   pack { padx 15 ; pady 15; side 'left' }
end
Tk.mainloop

Ở đây, sau khi tải mô-đun mở rộng tk, chúng tôi tạo một khung cấp gốc bằng cách sử dụng TkRoot.new . Sau đó, chúng tôi tạo một widget TkLabel như một phần tử con của khung gốc, thiết lập một số tùy chọn cho nhãn. Cuối cùng, chúng tôi đóng gói khung gốc và nhập vòng lặp sự kiện GUI chính.

Nếu bạn chạy tập lệnh này, nó sẽ tạo ra kết quả sau:

Các lớp tiện ích Ruby / Tk

Có một danh sách các lớp Ruby / Tk khác nhau, có thể được sử dụng để tạo GUI mong muốn bằng Ruby / Tk.

  • TkFrame Tạo và điều khiển các widget khung.

  • TkButton Tạo và điều khiển các nút widget.

  • TkLabel Tạo và điều khiển các widget nhãn.

  • TkEntry Tạo và điều khiển các widget mục nhập.

  • TkCheckButton Tạo và điều khiển các widget nút kiểm tra .

  • TkRadioButton Tạo và điều khiển các widget của radiobutton.

  • TkListbox Tạo và điều khiển các widget trong hộp danh sách.

  • TkComboBox Tạo và điều khiển các widget của hộp danh sách.

  • TkMenu Tạo và điều khiển các widget menu.

  • TkMenubutton Tạo và điều khiển các tiện ích menubutton.

  • Tk.messageBox Tạo và điều khiển hộp thoại tin nhắn.

  • TkScrollbar Tạo và điều khiển các widget trên thanh cuộn.

  • TkCanvas Tạo và điều khiển các widget canvas.

  • TkScale Tạo và điều khiển các widget quy mô.

  • TkText Tạo và điều khiển các widget văn bản.

  • TkToplevel Tạo và điều khiển các widget cấp trên cùng.

  • TkSpinbox Tạo và điều khiển các tiện ích Spinbox.

  • TkProgressBar Tạo và điều khiển các widget của Thanh tiến trình.

  • Hộp thoại Tạo và điều khiển các tiện ích Hộp thoại.

  • Tk :: Tile :: Notebook Hiển thị một số cửa sổ trong không gian hạn chế với phép ẩn dụ sổ tay.

  • Tk :: Tile :: Paned Hiển thị một số cửa sổ con, xếp chồng lên nhau theo chiều dọc hoặc chiều ngang.

  • Tk :: Tile :: Dấu phân cách Hiển thị thanh phân cách ngang hoặc dọc.

  • Phông chữ Ruby / Tk, Màu sắc và Hình ảnh Hiểu về Phông chữ Ruby / Tk, Màu sắc và Hình ảnh

Tùy chọn cấu hình tiêu chuẩn

Tất cả các widget đều có một số tùy chọn cấu hình khác nhau, thường kiểm soát cách chúng được hiển thị hoặc cách chúng hoạt động. Tất nhiên, các tùy chọn có sẵn phụ thuộc vào loại widget.

Đây là danh sách tất cả các tùy chọn cấu hình tiêu chuẩn, có thể áp dụng cho bất kỳ tiện ích Ruby / Tk nào.

Sr.No. Tùy chọn & Mô tả
1

activebackground => Chuỗi

Chỉ định màu nền để sử dụng khi vẽ các phần tử đang hoạt động. Một phần tử đang hoạt động nếu con trỏ chuột được định vị trên phần tử và việc nhấn nút chuột sẽ khiến một số hành động xảy ra. Bạn có thể sử dụng tên màu như "đỏ", "xanh dương", "hồng", "vàng", v.v.

2

activeborderwidth => Số nguyên

Chỉ định một giá trị không âm cho biết chiều rộng của đường viền 3-D được vẽ xung quanh các phần tử đang hoạt động.

3

activeforeground => Chuỗi

Chỉ định màu nền trước để sử dụng khi vẽ các phần tử đang hoạt động.

4

anchor => Chuỗi

Chỉ định cách thông tin trong tiện ích (ví dụ: văn bản hoặc bitmap) được hiển thị trong tiện ích. Phải là một trong các giá trịn, ne, e, se, s, sw, w, nw, hoặc là center. Ví dụ,nw nghĩa là hiển thị thông tin sao cho góc trên cùng bên trái của nó nằm ở góc trên cùng bên trái của tiện ích con.

5

background or bg => Chuỗi

Chỉ định màu nền bình thường để sử dụng khi hiển thị tiện ích.

6

bitmap => Bitmap

Chỉ định một bitmap để hiển thị trong tiện ích. Cách chính xác mà bitmap được hiển thị có thể bị ảnh hưởng bởi các tùy chọn khác như neo hoặc justify.

7

borderwidth or bd => Số nguyên

Chỉ định giá trị không âm cho biết chiều rộng của đường viền 3-D để vẽ xung quanh bên ngoài tiện ích.

số 8

compound => Chuỗi

Chỉ định xem tiện ích có nên hiển thị văn bản và ảnh bitmap / hình ảnh cùng một lúc hay không, và nếu có, thì bitmap / ảnh sẽ được đặt ở đâu so với văn bản. Phải là một trong các giá trịnone, bottom, top, left, right, hoặc là center.

9

cursor => Chuỗi

Chỉ định con trỏ chuột được sử dụng cho tiện ích con. Các giá trị có thể có có thể là "watch", "arrow", v.v.

10

disabledforeground => Chuỗi

Chỉ định màu nền trước để sử dụng khi vẽ một phần tử bị vô hiệu hóa.

11

exportselection => Boolean

Chỉ định xem một lựa chọn trong tiện ích con có phải là lựa chọn X. Giá trị có thể có bất kỳtrue, false, 0, 1, yes, hoặc là no. Nếu lựa chọn được xuất, thì việc chọn trong tiện ích con sẽ bỏ chọn lựa chọn X hiện tại, chọn bên ngoài tiện ích sẽ bỏ chọn bất kỳ lựa chọn tiện ích nào và tiện ích sẽ phản hồi các yêu cầu truy xuất lựa chọn khi có lựa chọn.

12

font => Chuỗi

Chỉ định phông chữ để sử dụng khi vẽ văn bản bên trong tiện ích.

13

foreground or fg => Chuỗi

Chỉ định màu nền trước bình thường để sử dụng khi hiển thị tiện ích.

14

highlightbackground => Chuỗi

Chỉ định màu để hiển thị trong vùng đánh dấu duyệt khi tiện ích con không có tiêu điểm đầu vào.

15

highlightcolor => Chuỗi

Chỉ định màu để sử dụng cho hình chữ nhật đánh dấu ngang được vẽ xung quanh tiện ích con khi nó có tiêu điểm đầu vào.

16

highlightthickness => Số nguyên

Chỉ định một giá trị không âm cho biết chiều rộng của hình chữ nhật đánh dấu để vẽ xung quanh bên ngoài tiện ích con khi nó có tiêu điểm đầu vào.

17

image => Hình ảnh

Chỉ định hình ảnh để hiển thị trong tiện ích con, hình ảnh này phải được tạo bằng tính năng tạo hình ảnh. Thông thường, nếu tùy chọn hình ảnh được chỉ định thì nó sẽ ghi đè các tùy chọn khác chỉ định một bitmap hoặc giá trị văn bản để hiển thị trong tiện ích con; tùy chọn hình ảnh có thể được đặt lại thành một chuỗi trống để bật lại hiển thị bitmap hoặc văn bản.

18

jump => Chuỗi

Đối với các tiện ích con có thanh trượt có thể được kéo để điều chỉnh giá trị, chẳng hạn như thanh cuộn và tỷ lệ, tùy chọn này xác định thời điểm thông báo được thực hiện về các thay đổi trong giá trị. Giá trị của tùy chọn phải là boolean. Nếu giá trị là false, cập nhật được thực hiện liên tục khi thanh trượt được kéo. Nếu giá trị là true, các bản cập nhật sẽ bị trì hoãn cho đến khi thả nút chuột để kết thúc quá trình kéo; tại thời điểm đó, một thông báo duy nhất được thực hiện.

19

justify => Chuỗi

Khi có nhiều dòng văn bản được hiển thị trong một widget, tùy chọn này sẽ xác định cách các dòng sắp xếp với nhau. Phải là một trong nhữngleft, center, hoặc là right. Left có nghĩa là các cạnh bên trái của các dòng đều thẳng hàng, center có nghĩa là tâm của các đường thẳng hàng và right có nghĩa là các cạnh bên phải của đường thẳng hàng.

20

offset => Chuỗi

Chỉ định độ lệch của các ô (xem thêm tileLựa chọn). Nó có thể có hai định dạng khác nhauoffset x,y hoặc là offset side, nơi có thể ở n, ne, e, se, s, sw, w, nw, hoặc là center.

21

orient => Chuỗi

Đối với các tiện ích con có thể tự bố trí theo hướng ngang hoặc dọc, chẳng hạn như thanh cuộn, tùy chọn này chỉ định hướng nào nên được sử dụng. Phải là một trong haihorizontal hoặc là vertical hoặc chữ viết tắt của một trong số này.

22

padx => Số nguyên

Chỉ định một giá trị không âm cho biết có bao nhiêu không gian thừa cần yêu cầu cho tiện ích con theo hướng X.

23

pady => Số nguyên

Chỉ định một giá trị không âm cho biết có bao nhiêu không gian thừa cần yêu cầu cho tiện ích con theo hướng Y.

24

relief => Số nguyên

Chỉ định hiệu ứng 3-D mong muốn cho tiện ích con. Giá trị có thể chấp nhận làraised, sunken, flat, ridgegroove.

25

repeatdelay => Số nguyên

Chỉ định số mili giây mà một nút hoặc phím phải được nhấn giữ trước khi nó bắt đầu tự động lặp lại. Ví dụ, được sử dụng trên mũi tên lên và xuống trong thanh cuộn.

26

repeatinterval => Số nguyên

Được sử dụng kết hợp với repeatdelay: sau khi tự động lặp lại bắt đầu, tùy chọn này xác định số mili giây giữa các lần tự động lặp lại

27

selectbackground => Chuỗi

Chỉ định màu nền để sử dụng khi hiển thị các mục đã chọn.

28

selectborderwidth => Số nguyên

Chỉ định một giá trị không âm cho biết chiều rộng của đường viền 3-D để vẽ xung quanh các mục đã chọn.

29

selectforeground => Chuỗi

Chỉ định màu nền trước để sử dụng khi hiển thị các mục đã chọn.

30

setgrid => Boolean

Chỉ định một giá trị boolean để xác định xem tiện ích con này có kiểm soát lưới thay đổi kích thước cho cửa sổ cấp cao nhất của nó hay không. Tùy chọn này thường được sử dụng trong các widget văn bản, trong đó thông tin trong widget có kích thước tự nhiên (kích thước của một ký tự) và nó có ý nghĩa đối với các kích thước của cửa sổ là các số tích phân của các đơn vị này.

31

takefocus => Số nguyên

Cung cấp thông tin được sử dụng khi di chuyển tiêu điểm từ cửa sổ này sang cửa sổ khác qua bàn phím (ví dụ: Tab và Shift-Tab). Trước khi đặt tiêu điểm cho một cửa sổ, trước tiên, các tập lệnh duyệt sẽ kiểm tra xem cửa sổ có thể xem được hay không (nó và tất cả tổ tiên của nó đã được ánh xạ); nếu không, cửa sổ bị bỏ qua. Giá trị 0 có nghĩa là cửa sổ này sẽ được bỏ qua hoàn toàn trong quá trình duyệt bàn phím. 1 có nghĩa là cửa sổ này phải luôn nhận tiêu điểm đầu vào.

32

text => Chuỗi

Chỉ định một chuỗi được hiển thị bên trong tiện ích con. Cách mà chuỗi được hiển thị phụ thuộc vào tiện ích cụ thể và có thể được xác định bởi các tùy chọn khác, chẳng hạn nhưanchor hoặc là justify.

33

textvariable => Biến

Chỉ định tên của một biến. Giá trị của biến là một chuỗi văn bản được hiển thị bên trong tiện ích con; nếu giá trị biến thay đổi thì tiện ích con sẽ tự động cập nhật để phản ánh giá trị mới. Cách mà chuỗi được hiển thị trong tiện ích phụ thuộc vào tiện ích cụ thể và có thể được xác định bởi các tùy chọn khác, chẳng hạn nhưanchor hoặc là justify.

34

tile => Hình ảnh

Chỉ định hình ảnh được sử dụng để hiển thị tiện ích. Nếu hình ảnh là chuỗi trống, thì màu nền bình thường được hiển thị.

35

troughcolor => Chuỗi

Chỉ định màu để sử dụng cho các vùng đáy hình chữ nhật trong các tiện ích con như thanh cuộn và tỷ lệ.

36

troughtile => Hình ảnh

Chỉ định hình ảnh được sử dụng để hiển thị trong các vùng đáy hình chữ nhật trong các tiện ích con như thanh cuộn và tỷ lệ.

37

underline => Số nguyên

Chỉ định chỉ số nguyên của một ký tự để gạch dưới trong tiện ích con. Tùy chọn này được sử dụng bởi các ràng buộc mặc định để triển khai truyền qua bàn phím cho các nút menu và mục menu. 0 tương ứng với ký tự đầu tiên của văn bản được hiển thị trong tiện ích con, 1 đến ký tự tiếp theo, v.v.

38

wraplength => Số nguyên

Đối với các widget có thể thực hiện gói từ, tùy chọn này chỉ định độ dài dòng tối đa.

39

xscrollcommand => chức năng

Chỉ định một lệnh gọi lại được sử dụng để giao tiếp với các thanh cuộn ngang.

40

yscrollcommand => chức năng

Chỉ định một lệnh gọi lại được sử dụng để giao tiếp với các thanh cuộn dọc.

Quản lý hình học Ruby / Tk

Quản lý hình học xử lý việc định vị các vật dụng khác nhau theo yêu cầu. Quản lý hình học trong Tk dựa trên khái niệm vật dụng chủ và phụ.

Cái chính là một tiện ích con, thường là một cửa sổ cấp cao nhất hoặc một khung, sẽ chứa các tiện ích con khác, được gọi là nô lệ. Bạn có thể coi một trình quản lý hình học là người kiểm soát tiện ích chính và quyết định những gì sẽ được hiển thị bên trong.

Trình quản lý hình học sẽ hỏi từng tiện ích con nô lệ về kích thước tự nhiên của nó hoặc kích thước lý tưởng mà nó muốn được hiển thị. Sau đó, nó lấy thông tin đó và kết hợp với bất kỳ tham số nào được cung cấp bởi chương trình khi nó yêu cầu trình quản lý hình học quản lý tiện ích phụ cụ thể đó.

Có ba trình quản lý hình học là place, gridpack chịu trách nhiệm kiểm soát kích thước và vị trí của từng widget trong giao diện.

  • lưới Trình quản lý hình học sắp xếp các tiện ích con trong một lưới.

  • gói Trình quản lý hình học đóng gói xung quanh các cạnh của khoang.

  • đặt Trình quản lý hình học cho vị trí cố định hoặc tấm cao su.

Xử lý sự kiện Ruby / Tk

Ruby / Tk hỗ trợ vòng lặp sự kiện , vòng lặp này nhận các sự kiện từ hệ điều hành. Đó là những thứ như nhấn nút, tổ hợp phím, di chuyển chuột, thay đổi kích thước cửa sổ, v.v.

Ruby / Tk sẽ quản lý vòng lặp sự kiện này cho bạn. Nó sẽ tìm ra tiện ích con nào áp dụng cho sự kiện (người dùng có nhấp vào nút này không? Nếu một phím được nhấn, hộp văn bản nào có tiêu điểm?) Và gửi nó cho phù hợp. Các widget riêng lẻ biết cách phản hồi các sự kiện, vì vậy, ví dụ: một nút có thể thay đổi màu sắc khi chuột di chuyển qua nó và hoàn nguyên khi chuột rời đi.

Ở cấp độ cao hơn, Ruby / Tk gọi các lệnh gọi lại trong chương trình của bạn để chỉ ra rằng có điều gì đó quan trọng đã xảy ra với một widget Đối với cả hai trường hợp, bạn có thể cung cấp một khối mã hoặc một đối tượng Ruby Proc chỉ định cách ứng dụng phản hồi với sự kiện hoặc lệnh gọi lại.

Chúng ta hãy xem cách sử dụng phương thức bind để liên kết các sự kiện cơ bản của hệ thống cửa sổ với các thủ tục Ruby xử lý chúng. Hình thức ràng buộc đơn giản nhất lấy đầu vào của nó một chuỗi chỉ ra tên sự kiện và một khối mã mà Tk sử dụng để xử lý sự kiện.

Ví dụ: để bắt sự kiện ButtonRelease cho nút chuột đầu tiên trên một số tiện ích, bạn sẽ viết:

someWidget.bind('ButtonRelease-1') {
   ....code block to handle this event...
}

Tên sự kiện có thể bao gồm bổ sung và chi tiết. Công cụ sửa đổi là một chuỗi như Shift , Control hoặc Alt , cho biết rằng một trong các phím bổ trợ đã được nhấn.

Vì vậy, chẳng hạn, để bắt sự kiện được tạo ra khi người dùng giữ phím Ctrl và nhấp vào nút chuột phải.

someWidget.bind('Control-ButtonPress-3', proc { puts "Ouch!" })

Nhiều tiện ích con Ruby / Tk có thể kích hoạt lệnh gọi lại khi người dùng kích hoạt chúng và bạn có thể sử dụng lệnh gọi lại để chỉ định rằng một khối mã hoặc thủ tục nhất định được gọi khi điều đó xảy ra. Như đã thấy trước đó, bạn có thể chỉ định thủ tục gọi lại lệnh khi tạo tiện ích con -

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command proc { showHelp }
}

Hoặc bạn có thể gán nó sau bằng cách sử dụng phương thức lệnh của tiện ích con -

helpButton.command proc { showHelp }

Vì phương thức lệnh chấp nhận thủ tục hoặc khối mã, bạn cũng có thể viết ví dụ mã trước đó là:

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command { showHelp }
}
Sr.No. Thẻ & Mô tả sự kiện
1

"1" (one)

Nhấn nút trái chuột.

2

"ButtonPress-1"

Nhấn nút trái chuột.

3

"Enter"

Đã di chuyển chuột vào bên trong.

4

"Leave"

Di chuyển chuột ra bên ngoài.

5

"Double-1"

Nhấp đúp.

6

"B3-Motion"

Nút bên phải kéo từ vị trí này sang vị trí khác.

7

Control-ButtonPress-3

Nút phải được nhấn cùng với phím Ctrl .

số 8

Alt-ButtonPress-1

Nút Let được nhấn cùng với Phím Alt .

Phương pháp cấu hình

Các cấu hình phương pháp có thể được sử dụng để thiết lập và lấy bất kỳ giá trị cấu hình widget. Ví dụ: để thay đổi chiều rộng của một nút, bạn có thể gọi phương thức cấu hình bất kỳ lúc nào như sau:

require "tk"

button = TkButton.new {
   text 'Hello World!'
   pack
}
button.configure('activebackground', 'blue')
Tk.mainloop

Để nhận giá trị cho tiện ích con hiện tại, chỉ cần cung cấp cho nó mà không có giá trị như sau:

color = button.configure('activebackground')

Bạn cũng có thể gọi cấu hình mà không có bất kỳ tùy chọn nào, điều này sẽ cung cấp cho bạn danh sách tất cả các tùy chọn và giá trị của chúng.

Phương pháp cget

Để chỉ đơn giản là lấy giá trị của một tùy chọn, cấu hình trả về nhiều thông tin hơn bạn thường muốn. Phương thức cget chỉ trả về giá trị hiện tại.

color = button.cget('activebackground')

Ruby / LDAP là một thư viện mở rộng cho Ruby. Nó cung cấp giao diện cho một số thư viện LDAP như OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.

API chung để phát triển ứng dụng được mô tả trong RFC1823 và được hỗ trợ bởi Ruby / LDAP.

Cài đặt Ruby / LDAP

Bạn có thể tải xuống và cài đặt gói Ruby / LDAP hoàn chỉnh từ SOURCEFORGE.NET .

Trước khi cài đặt Ruby / LDAP, hãy đảm bảo rằng bạn có các thành phần sau:

  • Ruby 1.8.x (ít nhất 1.8.2 nếu bạn muốn sử dụng ldap / control).
  • OpenLDAP, Netscape SDK, Windows 2003 hoặc Windows XP.

Bây giờ, bạn có thể sử dụng phương pháp Cài đặt Ruby tiêu chuẩn. Trước khi bắt đầu, nếu bạn muốn xem các tùy chọn có sẵn cho extconf.rb, hãy chạy nó với tùy chọn '--help'.

$ ruby extconf.rb [--with-openldap1|--with-openldap2| \
                   --with-netscape|--with-wldap32]
$ make $ make install

NOTE- Nếu bạn đang xây dựng phần mềm trên Windows, bạn có thể cần sử dụng nmake thay vì make .

Thiết lập kết nối LDAP

Đây là một quy trình gồm hai bước -

Bước 1 - Tạo đối tượng kết nối

Sau đây là cú pháp để tạo kết nối đến thư mục LDAP.

LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
  • host- Đây là ID máy chủ đang chạy thư mục LDAP. Chúng tôi sẽ lấy nó làm localhost .

  • port- Đây là cổng đang được sử dụng cho dịch vụ LDAP. Các cổng LDAP tiêu chuẩn là 636 và 389. Đảm bảo rằng cổng nào đang được sử dụng tại máy chủ của bạn, nếu không, bạn có thể sử dụng LDAP :: LDAP_PORT.

Lệnh gọi này trả về kết nối LDAP :: Conn mới với máy chủ, máy chủ lưu trữ , trên cổng cổng .

Bước 2 - Ràng buộc

Đây là nơi chúng tôi thường chỉ định tên người dùng và mật khẩu mà chúng tôi sẽ sử dụng cho phần còn lại của phiên.

Sau đây là cú pháp để liên kết kết nối LDAP, sử dụng DN, dn, thông tin xác thực, pwdvà phương thức ràng buộc, method -

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)do
....
end

Bạn có thể sử dụng cùng một phương pháp mà không cần khối mã. Trong trường hợp này, bạn cần phải hủy liên kết kết nối một cách rõ ràng như sau:

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)
....
conn.unbind

Nếu một khối mã được đưa ra, bản thân sẽ được nhường cho khối.

Giờ đây, chúng tôi có thể thực hiện các thao tác tìm kiếm, thêm, sửa đổi hoặc xóa bên trong khối của phương thức liên kết (giữa ràng buộc và hủy liên kết), miễn là chúng tôi có quyền thích hợp.

Example

Giả sử chúng ta đang làm việc trên một máy chủ cục bộ, hãy đặt mọi thứ lại với nhau bằng máy chủ lưu trữ, miền, id người dùng và mật khẩu thích hợp, v.v.

#/usr/bin/ruby -w

require 'ldap'

$HOST = 'localhost' $PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
....
conn.unbind

Thêm mục nhập LDAP

Thêm một mục LDPA là một quá trình gồm hai bước -

Bước 1 - Tạo đối tượng LDAP :: Mod

Chúng ta cần truyền đối tượng LDAP :: Mod tới phương thức conn.add để tạo một mục nhập. Đây là một cú pháp đơn giản để tạo đối tượng LDAP :: Mod -

Mod.new(mod_type, attr, vals)
  • mod_type - Một hoặc nhiều tùy chọn LDAP_MOD_ADD, LDAP_MOD_REPLACE hoặc LDAP_MOD_DELETE.

  • attr - phải là tên của thuộc tính sẽ hoạt động.

  • vals- là một mảng các giá trị liên quan đến attr . Nếu vals chứa dữ liệu nhị phân, mod_type phải được OR'ed (|) một cách hợp lý với LDAP_MOD_BVALUES.

Lệnh gọi này trả về đối tượng LDAP :: Mod , có thể được truyền cho các phương thức trong lớp LDAP :: Conn, chẳng hạn như Conn # add, Conn # add_ext, Conn # mod và Conn # mod_ext.

Bước 2 - Gọi phương thức conn.add

Khi chúng ta đã sẵn sàng với đối tượng LDAP :: Mod , chúng ta có thể gọi phương thức conn.add để tạo một mục nhập. Đây là cú pháp để gọi phương thức này:

conn.add(dn, attrs)

Phương thức này thêm một mục nhập có DN, dn và các thuộc tính, attrs . Ở đây, phần đính kèm phải là một mảng các đối tượng LDAP :: Mod hoặc một hàm băm của các cặp mảng thuộc tính / giá trị.

Example

Đây là một ví dụ hoàn chỉnh, sẽ tạo ra hai mục nhập thư mục -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','domain']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'o',['TTSKY.NET']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'dc',['localhost']),
]

entry2 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','person']),
   LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Zara Ali']),
   LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn', 
                     ['ttate','ALI', "zero\000zero"]),
]

begin
   conn.add("dc = localhost, dc = localdomain", entry1)
   conn.add("cn = Zara Ali, dc = localhost, dc =  localdomain", entry2)
rescue LDAP::ResultError
   conn.perror("add")
   exit
end
conn.perror("add")
conn.unbind

Sửa đổi mục nhập LDAP

Sửa đổi một mục nhập tương tự như thêm một mục nhập. Chỉ cần gọi phương thức sửa đổi thay vì thêm với các thuộc tính để sửa đổi. Đây là một cú pháp đơn giản của phương thức sửa đổi .

conn.modify(dn, mods)

Phương thức này sửa đổi một mục nhập có DN, dn và các thuộc tính, mod . Ở đây, mod phải là một mảng các đối tượng LDAP :: Mod hoặc một hàm băm của các cặp mảng thuộc tính / giá trị.

Thí dụ

Để sửa đổi họ của mục nhập, mà chúng tôi đã thêm trong phần trước, chúng tôi sẽ viết:

#/usr/bin/ruby -w

require 'ldap'

$HOST = 'localhost' $PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'sn', ['Mohtashim']),
]

begin
   conn.modify("cn = Zara Ali, dc = localhost, dc = localdomain", entry1)
rescue LDAP::ResultError
   conn.perror("modify")
   exit
end
conn.perror("modify")
conn.unbind

Xóa mục nhập LDAP

Để xóa một mục nhập, hãy gọi phương thức xóa với tên phân biệt là tham số. Đây là một cú pháp đơn giản của phương thức xóa .

conn.delete(dn)

Phương thức này xóa một mục nhập có DN, dn .

Thí dụ

Để xóa mục nhập Zara Mohtashim , mà chúng tôi đã thêm trong phần trước, chúng tôi sẽ viết:

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.delete("cn = Zara-Mohtashim, dc = localhost, dc = localdomain")
rescue LDAP::ResultError
   conn.perror("delete")
   exit
end
conn.perror("delete")
conn.unbind

Sửa đổi tên phân biệt

Không thể sửa đổi tên phân biệt của mục nhập bằng phương thức sửa đổi . Thay vào đó, hãy sử dụng phương thức modrdn . Đây là cú pháp đơn giản của phương thức modrdn -

conn.modrdn(dn, new_rdn, delete_old_rdn)

Phương thức này sửa đổi RDN của mục nhập với DN, dn , tạo cho nó RDN mới, new_rdn . Nếu delete_old_rdntrue , giá trị RDN cũ sẽ bị xóa khỏi mục nhập.

Thí dụ

Giả sử chúng ta có mục nhập sau:

dn: cn = Zara Ali,dc = localhost,dc = localdomain
cn: Zara Ali
sn: Ali
objectclass: person

Sau đó, chúng ta có thể sửa đổi tên phân biệt của nó bằng mã sau:

#/usr/bin/ruby -w

require 'ldap'

$HOST = 'localhost' $PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.modrdn("cn = Zara Ali, dc = localhost, dc = localdomain", "cn = Zara Mohtashim", true)
rescue LDAP::ResultError
   conn.perror("modrdn")
   exit
end
conn.perror("modrdn")
conn.unbind

Thực hiện Tìm kiếm

Để thực hiện tìm kiếm trên thư mục LDAP, hãy sử dụng phương pháp tìm kiếm với một trong ba chế độ tìm kiếm khác nhau -

  • LDAP_SCOPE_BASEM - Chỉ tìm kiếm nút cơ sở.

  • LDAP_SCOPE_ONELEVEL - Tìm kiếm tất cả các nút con của nút cơ sở.

  • LDAP_SCOPE_SUBTREE - Tìm kiếm toàn bộ cây con bao gồm cả nút cơ sở.

Thí dụ

Ở đây, chúng ta sẽ tìm kiếm toàn bộ cây con của mục nhập dc = localhost, dc = localdomain cho các đối tượng người -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT

base = 'dc = localhost,dc = localdomain'
scope = LDAP::LDAP_SCOPE_SUBTREE
filter = '(objectclass = person)'
attrs = ['sn', 'cn']

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.search(base, scope, filter, attrs) { |entry|
      # print distinguished name
      p entry.dn
      # print all attribute names
      p entry.attrs
      # print values of attribute 'sn'
      p entry.vals('sn')
      # print entry as Hash
      p entry.to_hash
   }
rescue LDAP::ResultError
   conn.perror("search")
   exit
end
conn.perror("search")
conn.unbind

Điều này gọi khối mã đã cho cho mỗi mục nhập phù hợp trong đó mục nhập LDAP được đại diện bởi một phiên bản của lớp LDAP :: Entry. Với tham số cuối cùng của tìm kiếm, bạn có thể chỉ định các thuộc tính mà bạn quan tâm, bỏ qua tất cả các thuộc tính khác. Nếu bạn chuyển nil ở đây, tất cả các thuộc tính được trả về giống như "SELECT *" trong cơ sở dữ liệu quan hệ.

Phương thức dn (bí danh cho get_dn) của lớp LDAP :: Entry trả về tên phân biệt của mục nhập và với phương thức to_hash, bạn có thể nhận được biểu diễn băm của các thuộc tính của nó (bao gồm cả tên phân biệt). Để nhận danh sách các thuộc tính của mục nhập, hãy sử dụng phương thức attrs (bí danh cho get_attributes). Ngoài ra, để lấy danh sách các giá trị của một thuộc tính cụ thể, hãy sử dụng phương thức vals (bí danh cho get_values).

Xử lý lỗi

Ruby / LDAP định nghĩa hai lớp ngoại lệ khác nhau:

  • Trong trường hợp xảy ra lỗi, các phương thức mới, liên kết hoặc hủy liên kết sẽ đưa ra ngoại lệ LDAP :: Lỗi.

  • Trong trường hợp thêm, sửa đổi, xóa hoặc tìm kiếm một thư mục LDAP, gây ra LDAP :: ResultError.

Đọc thêm

Để biết chi tiết đầy đủ về các phương pháp LDAP, vui lòng tham khảo tài liệu tiêu chuẩn cho Tài liệu LDAP .

Các chương trình truyền thống có một luồng thực thi duy nhất, các câu lệnh hoặc lệnh bao gồm chương trình được thực thi tuần tự cho đến khi chương trình kết thúc.

Một chương trình đa luồng có nhiều hơn một luồng thực thi. Trong mỗi luồng, các câu lệnh được thực thi tuần tự, nhưng bản thân các luồng có thể được thực thi song song trên một CPU đa lõi chẳng hạn. Thường thì trên một máy CPU, nhiều luồng không thực sự được thực thi song song, nhưng sự song song được mô phỏng bằng cách xen kẽ việc thực thi của các luồng.

Ruby giúp dễ dàng viết các chương trình đa luồng với lớp Thread . Các chuỗi Ruby là một cách nhẹ và hiệu quả để đạt được sự đồng thời trong mã của bạn.

Tạo chuỗi Ruby

Để bắt đầu một chuỗi mới, chỉ cần liên kết một khối với một lệnh gọi tới Thread.new . Một luồng mới sẽ được tạo để thực thi mã trong khối và luồng gốc sẽ trở lại từ Thread.new ngay lập tức và tiếp tục thực thi với câu lệnh tiếp theo -

# Thread #1 is running here
Thread.new {
   # Thread #2 runs this code
}
# Thread #1 runs this code

Thí dụ

Đây là một ví dụ cho thấy chúng ta có thể sử dụng chương trình Ruby đa luồng như thế nào.

#!/usr/bin/ruby

def func1
   i = 0
   while i<=2
      puts "func1 at: #{Time.now}"
      sleep(2)
      i = i+1
   end
end

def func2
   j = 0
   while j<=2
      puts "func2 at: #{Time.now}"
      sleep(1)
      j = j+1
   end
end

puts "Started At #{Time.now}"
t1 = Thread.new{func1()}
t2 = Thread.new{func2()}
t1.join
t2.join
puts "End at #{Time.now}"

Điều này sẽ tạo ra kết quả sau:

Started At Wed May 14 08:21:54 -0700 2008
func1 at: Wed May 14 08:21:54 -0700 2008
func2 at: Wed May 14 08:21:54 -0700 2008
func2 at: Wed May 14 08:21:55 -0700 2008
func1 at: Wed May 14 08:21:56 -0700 2008
func2 at: Wed May 14 08:21:56 -0700 2008
func1 at: Wed May 14 08:21:58 -0700 2008
End at Wed May 14 08:22:00 -0700 2008

Vòng đời của chuỗi

Một chủ đề mới được tạo với Thread.new . Bạn cũng có thể sử dụng các từ đồng nghĩa Thread.startThread.fork .

Không cần bắt đầu một luồng sau khi tạo nó, nó bắt đầu chạy tự động khi có sẵn tài nguyên CPU.

Lớp Thread định nghĩa một số phương thức để truy vấn và thao tác với luồng khi nó đang chạy. Một luồng chạy mã trong khối được liên kết với lệnh gọi tới Thread.new và sau đó nó ngừng chạy.

Giá trị của biểu thức cuối cùng trong khối đó là giá trị của luồng và có thể nhận được bằng cách gọi phương thức giá trị của đối tượng Luồng . Nếu luồng đã hoàn thành, thì giá trị trả về giá trị của luồng ngay lập tức. Nếu không, phương thức giá trị sẽ chặn và không trả về cho đến khi luồng hoàn thành.

Phương thức lớp Thread.current trả về đối tượng Thread đại diện cho luồng hiện tại. Điều này cho phép các chủ đề tự thao tác. Phương thức lớp Thread.main trả về đối tượng Thread đại diện cho luồng chính. Đây là luồng thực thi ban đầu bắt đầu khi chương trình Ruby được khởi động.

Bạn có thể đợi một luồng cụ thể kết thúc bằng cách gọi phương thức Thread.join của luồng đó . Luồng đang gọi sẽ chặn cho đến khi kết thúc luồng đã cho.

Chủ đề và ngoại lệ

Nếu một ngoại lệ được đưa ra trong luồng chính và không được xử lý ở bất kỳ đâu, trình thông dịch Ruby sẽ in một thông báo và thoát. Trong các luồng, ngoài luồng chính, các ngoại lệ không được xử lý sẽ khiến luồng ngừng chạy.

Nếu một chủ đề t thoát vì một ngoại lệ chưa được xử lý và một chuỗi khác sgọi t.join hoặc t.value, sau đó là ngoại lệ xảy ra trongt được nâng lên trong chủ đề s.

Nếu Thread.abort_on_exceptionfalse , điều kiện mặc định, một ngoại lệ không được xử lý chỉ đơn giản là giết luồng hiện tại và tất cả phần còn lại tiếp tục chạy.

Nếu bạn muốn bất kỳ ngoại lệ chưa được xử lý nào trong bất kỳ luồng nào khiến trình thông dịch thoát ra, hãy đặt phương thức lớp Thread.abort_on_exception thành true .

t = Thread.new { ... }
t.abort_on_exception = true

Biến chuỗi

Một luồng thường có thể truy cập bất kỳ biến nào trong phạm vi khi luồng được tạo. Các biến cục bộ đối với khối của một chuỗi là cục bộ của chuỗi và không được chia sẻ.

Lớp luồng có một cơ sở đặc biệt cho phép các biến cục bộ của luồng được tạo và truy cập bằng tên. Bạn chỉ cần coi đối tượng luồng như thể nó là một Hash, ghi vào các phần tử bằng cách sử dụng [] = và đọc lại chúng bằng cách sử dụng [].

Trong ví dụ này, mỗi thread ghi lại giá trị hiện tại của số biến trong một biến ThreadLocal với phím mycount .

#!/usr/bin/ruby

count = 0
arr = []

10.times do |i|
   arr[i] = Thread.new {
      sleep(rand(0)/10.0)
      Thread.current["mycount"] = count
      count += 1
   }
end

arr.each {|t| t.join; print t["mycount"], ", " }
puts "count = #{count}"

Điều này tạo ra kết quả sau:

8, 0, 3, 7, 2, 1, 6, 5, 4, 9, count = 10

Luồng chính đợi các luồng phụ kết thúc và sau đó in ra giá trị của số lượng được bắt bởi mỗi luồng .

Ưu tiên chuỗi

Yếu tố đầu tiên ảnh hưởng đến việc lập lịch luồng là độ ưu tiên của luồng: các luồng có mức độ ưu tiên cao được lập lịch trước các luồng có mức độ ưu tiên thấp. Chính xác hơn, một luồng sẽ chỉ nhận được thời gian CPU nếu không có luồng nào có mức độ ưu tiên cao hơn đang chờ chạy.

Bạn có thể đặt và truy vấn mức độ ưu tiên của một đối tượng Ruby Thread với ưu tiên =ưu tiên . Một luồng mới được tạo bắt đầu ở cùng mức ưu tiên với luồng đã tạo ra nó. Luồng chính bắt đầu ở mức ưu tiên 0.

Không có cách nào để đặt mức độ ưu tiên của một luồng trước khi nó bắt đầu chạy. Tuy nhiên, một luồng có thể tăng hoặc giảm mức độ ưu tiên của chính nó như là hành động đầu tiên mà nó thực hiện.

Loại trừ chủ đề

Nếu hai luồng chia sẻ quyền truy cập vào cùng một dữ liệu và ít nhất một trong các luồng sửa đổi dữ liệu đó, bạn phải đặc biệt chú ý để đảm bảo rằng không có luồng nào có thể xem dữ liệu ở trạng thái không nhất quán. Đây được gọi là loại trừ luồng .

Mutexlà một lớp thực hiện một khóa semaphore đơn giản để truy cập loại trừ lẫn nhau vào một số tài nguyên được chia sẻ. Có nghĩa là, chỉ một luồng có thể giữ khóa tại một thời điểm nhất định. Các chủ đề khác có thể chọn xếp hàng chờ khóa khả dụng hoặc có thể đơn giản chọn nhận lỗi ngay lập tức cho biết khóa không khả dụng.

Bằng cách đặt tất cả quyền truy cập vào dữ liệu được chia sẻ dưới sự kiểm soát của mutex , chúng tôi đảm bảo tính nhất quán và hoạt động nguyên tử. Hãy thử lấy các ví dụ, ví dụ đầu tiên không có mutax và ví dụ thứ hai có mutax -

Ví dụ không có Mutax

#!/usr/bin/ruby
require 'thread'

count1 = count2 = 0
difference = 0
counter = Thread.new do
   loop do
      count1 += 1
      count2 += 1
   end
end
spy = Thread.new do
   loop do
      difference += (count1 - count2).abs
   end
end
sleep 1
puts "count1 :  #{count1}"
puts "count2 :  #{count2}"
puts "difference : #{difference}"

Điều này sẽ tạo ra kết quả sau:

count1 :  1583766
count2 :  1583766
difference : 0
#!/usr/bin/ruby
require 'thread'
mutex = Mutex.new

count1 = count2 = 0
difference = 0
counter = Thread.new do
   loop do
      mutex.synchronize do
         count1 += 1
         count2 += 1
      end
   end
end
spy = Thread.new do
   loop do
      mutex.synchronize do
         difference += (count1 - count2).abs
      end
   end
end
sleep 1
mutex.lock
puts "count1 :  #{count1}"
puts "count2 :  #{count2}"
puts "difference : #{difference}"

Điều này sẽ tạo ra kết quả sau:

count1 :  696591
count2 :  696591
difference : 0

Xử lý bế tắc

Khi bắt đầu sử dụng các đối tượng Mutex để loại trừ luồng, chúng ta phải cẩn thận để tránh bế tắc . Bế tắc là điều kiện xảy ra khi tất cả các luồng đang chờ lấy một tài nguyên do một luồng khác nắm giữ. Bởi vì tất cả các luồng bị chặn, chúng không thể giải phóng ổ khóa mà chúng giữ. Và bởi vì chúng không thể giải phóng các ổ khóa, không một luồng nào khác có thể có được những ổ khóa đó.

Đây là lúc các biến điều kiện đi vào hình ảnh. Một biến điều kiện chỉ đơn giản là một semaphore được liên kết với một tài nguyên và được sử dụng trong sự bảo vệ của một mutex cụ thể . Khi bạn cần một tài nguyên không có sẵn, bạn đợi một biến điều kiện. Hành động đó sẽ giải phóng khóa trên mutex tương ứng . Khi một số luồng khác báo hiệu rằng tài nguyên có sẵn, luồng ban đầu sẽ không chờ đợi và đồng thời lấy lại khóa trên vùng quan trọng.

Thí dụ

#!/usr/bin/ruby
require 'thread'
mutex = Mutex.new

cv = ConditionVariable.new
a = Thread.new {
   mutex.synchronize {
      puts "A: I have critical section, but will wait for cv"
      cv.wait(mutex)
      puts "A: I have critical section again! I rule!"
   }
}

puts "(Later, back at the ranch...)"

b = Thread.new {
   mutex.synchronize {
      puts "B: Now I am critical, but am done with cv"
      cv.signal
      puts "B: I am still critical, finishing up"
   }
}
a.join
b.join

Điều này sẽ tạo ra kết quả sau:

A: I have critical section, but will wait for cv
(Later, back at the ranch...)
B: Now I am critical, but am done with cv
B: I am still critical, finishing up
A: I have critical section again! I rule!

Tiểu bang

Có năm giá trị trả về có thể có tương ứng với năm trạng thái có thể được hiển thị trong bảng sau. Các tình trạng phương thức trả về trạng thái của chủ đề.

Trạng thái chuỗi Giá trị trả lại
Runnable chạy
Đang ngủ Đang ngủ
Hủy bỏ phá thai
Kết thúc bình thường sai
Đã chấm dứt với ngoại lệ không

Phương thức lớp chủ đề

Các phương thức sau được cung cấp bởi lớp Thread và chúng có thể áp dụng cho tất cả các luồng có sẵn trong chương trình. Các phương thức này sẽ được gọi bằng cách sử dụng tên lớp Thread như sau:

Thread.abort_on_exception = true
Sr.No. Phương pháp & Mô tả
1

Thread.abort_on_exception

Trả về trạng thái hủy bỏ toàn cục với điều kiện ngoại lệ . Giá trị mặc định là sai . Khi được đặt thành true , sẽ khiến tất cả các luồng bị hủy bỏ (quá trình sẽ thoát (0)) nếu một ngoại lệ được đưa ra trong bất kỳ luồng nào

2

Thread.abort_on_exception=

Khi được đặt thành true , tất cả các chuỗi sẽ hủy bỏ nếu một ngoại lệ được đưa ra. Trả về trạng thái mới.

3

Thread.critical

Trả về trạng thái của điều kiện quan trọng của chuỗi chung .

4

Thread.critical=

Đặt trạng thái của điều kiện quan trọng của chuỗi chung và trả về nó. Khi được đặt thành true , sẽ cấm lập lịch cho bất kỳ luồng nào hiện có. Không chặn các chủ đề mới được tạo và chạy. Các hoạt động nhất định của chuỗi (chẳng hạn như dừng hoặc hủy một chuỗi, ngủ trong chuỗi hiện tại và đưa ra một ngoại lệ) có thể khiến một chuỗi được lên lịch ngay cả khi ở trong một phần quan trọng.

5

Thread.current

Trả về luồng hiện đang thực thi.

6

Thread.exit

Chấm dứt luồng hiện đang chạy và lên lịch chạy luồng khác. Nếu luồng này đã được đánh dấu là bị hủy, thoát trả về Luồng . Nếu đây là luồng chính hoặc luồng cuối cùng, hãy thoát khỏi quy trình.

7

Thread.fork { block }

Từ đồng nghĩa với Thread.new.

số 8

Thread.kill( aThread )

Làm cho một Chủ đề đã cho để thoát

9

Thread.list

Returns một loạt các chủ đề đối tượng cho tất cả các chủ đề đó là một trong hai Runnable hoặc dừng lại. Chủ đề.

10

Thread.main

Trả về luồng chính cho quy trình.

11

Thread.new( [ arg ]* ) {| args | block }

Tạo một chuỗi mới để thực hiện các hướng dẫn được đưa ra trong khối và bắt đầu chạy nó. Bất kỳ đối số nào được chuyển đến Thread.new đều được chuyển vào khối.

12

Thread.pass

Gọi bộ lập lịch luồng chuyển việc thực thi cho một luồng khác.

13

Thread.start( [ args ]* ) {| args | block }

Về cơ bản giống với Thread.new . Tuy nhiên, nếu Thread của lớp là lớp con, thì việc gọi start trong lớp con đó sẽ không gọi phương thức khởi tạo của lớp con .

14

Thread.stop

Dừng thực thi luồng hiện tại, đưa nó vào trạng thái ngủ và lên lịch thực thi một luồng khác. Đặt lại điều kiện quan trọng thành false.

Phương thức phiên bản chủ đề

Các phương pháp này có thể áp dụng cho một phiên bản của một luồng. Các phương thức này sẽ được gọi bằng cách sử dụng một thể hiện của một Luồng như sau:

#!/usr/bin/ruby

thr = Thread.new do   # Calling a class method new
   puts "In second thread"
   raise "Raise exception"
end
thr.join   # Calling an instance method join
Sr.No. Phương pháp & Mô tả
1

thr[ aSymbol ]

Tham chiếu thuộc tính - Trả về giá trị của biến cục bộ luồng, sử dụng ký hiệu hoặc tên aSymbol . Nếu biến được chỉ định không tồn tại, trả về nil .

2

thr[ aSymbol ] =

Gán thuộc tính - Đặt hoặc tạo giá trị của biến cục bộ luồng, sử dụng ký hiệu hoặc chuỗi.

3

thr.abort_on_exception

Trả về trạng thái hủy bỏ với điều kiện ngoại lệ cho thr . Giá trị mặc định là sai .

4

thr.abort_on_exception=

Khi được đặt thành true , tất cả các luồng (bao gồm cả chương trình chính) sẽ hủy bỏ nếu một ngoại lệ được đưa ra trong thr . Quá trình sẽ thoát ra một cách hiệu quả (0) .

5

thr.alive?

Trả về true nếu thr đang chạy hoặc đang ngủ.

6

thr.exit

Kết thúc thr và lên lịch chạy một luồng khác. Nếu chủ đề này đã được đánh dấu để bị giết, cảnh trả về chủ đề . Nếu đây là luồng chính hoặc luồng cuối cùng, sẽ thoát khỏi quy trình.

7

thr.join

Luồng gọi sẽ tạm ngừng thực thi và chạy thr . Không trở lại cho đến khi thr thoát. Mọi luồng không được tham gia sẽ bị giết khi chương trình chính thoát.

số 8

thr.key?

Trả về true nếu chuỗi (hoặc ký hiệu) đã cho tồn tại dưới dạng biến cục bộ luồng.

9

thr.kill

Từ đồng nghĩa với Thread.exit .

10

thr.priority

Trả về mức độ ưu tiên của thr . Mặc định là 0; luồng ưu tiên cao hơn sẽ chạy trước luồng ưu tiên thấp hơn.

11

thr.priority=

Đặt mức độ ưu tiên của thr thành Số nguyên. Các luồng có mức ưu tiên cao hơn sẽ chạy trước các luồng có mức ưu tiên thấp hơn.

12

thr.raise( anException )

Tăng một ngoại lệ từ thr . Người gọi không phải là Thr .

13

thr.run

Tỉnh dậy Thr , làm cho nó đủ điều kiện để lập lịch trình. Nếu không nằm trong phần quan trọng, thì hãy gọi bộ lập lịch.

14

thr.safe_level

Trả về mức an toàn có hiệu lực cho thr .

15

thr.status

Trả về trạng thái của thr : sleep nếu thr đang ngủ hoặc đang chờ vào I / O, chạy nếu thr đang thực thi, false nếu thr kết thúc bình thường và nil nếu thr kết thúc bằng ngoại lệ.

16

thr.stop?

Trả về true nếu thr đã chết hoặc đang ngủ.

17

thr.value

Đợi thr hoàn thành qua Thread.join và trả về giá trị của nó.

18

thr.wakeup

Marks Thr như đủ điều kiện để lập lịch trình, nó vẫn có thể vẫn bị chặn trên I / O, tuy nhiên.

Vì mô-đun Kernel được bao gồm bởi lớp Object , các phương thức của nó có sẵn ở mọi nơi trong chương trình Ruby. Chúng có thể được gọi mà không cần bộ thu (dạng chức năng). Do đó, chúng thường được gọi là hàm.

Sr.No. Phương pháp & Mô tả
1

abort

Chấm dứt chương trình. Nếu một ngoại lệ được đưa ra (ví dụ: $! Not nil), thông báo lỗi của nó sẽ được hiển thị.

2

Array( obj)

Trả về obj sau khi chuyển đổi nó thành một mảng bằng to_ary hoặc to_a.

3

at_exit {...}

Đăng ký một khối để thực thi khi chương trình thoát. Tương tự như câu lệnh END, nhưng câu lệnh END chỉ đăng ký khối một lần.

4

autoload( classname, file)

Đăng ký tên lớp lớp sẽ được tải từ tệp lần đầu tiên nó được sử dụng. tên lớp có thể là một chuỗi hoặc một ký hiệu.

5

binding

Trả về các ràng buộc của biến và phương thức hiện tại. Các Ràng buộc đối tượng được trả về có thể được truyền cho eval phương pháp như là đối số thứ hai.

6

block_given?

Trả về true nếu phương thức được gọi với một khối .

7

callcc {| c|...}

Truyền một đối tượng Tiếp tục c đến khối và thực thi khối. callcc có thể được sử dụng cho lối ra toàn cục hoặc cấu trúc vòng lặp.

số 8

caller([ n])

Trả về ngăn xếp thực thi hiện tại trong một mảng các chuỗi trong tệp biểu mẫu : dòng . Nếu n được chỉ định, trả về các mục ngăn xếp từ cấp thứ n trở xuống.

9

catch( tag) {...}

Bắt một lối thoát phi địa phương bằng một lần ném được gọi trong quá trình thực thi khối của nó.

10

chomp([ rs = $/])

Trả về giá trị của biến $_ with the ending newline removed, assigning the result back to $_ Giá trị của chuỗi dòng mới có thể được chỉ định bằng rs.

11

chomp!([ rs = $/])

Loại bỏ dòng mới khỏi $ _, sửa đổi chuỗi tại chỗ.

12

chop

Trả về giá trị của $_ with its last character (one byte) removed, assigning the result back to $_

13

chop!

Xóa ký tự cuối cùng khỏi $ _, sửa đổi chuỗi tại chỗ.

14

eval( str[, scope[, file, line]])

Thực thi str dưới dạng mã Ruby. Ràng buộc để thực hiện đánh giá có thể được chỉ định với phạm vi . Tên tệp và số dòng của mã được biên dịch có thể được chỉ định bằng cách sử dụng tệp và dòng.

15

exec( cmd[, arg...])

Thay thế tiến trình hiện tại bằng cách chạy lệnh cmd . Nếu nhiều đối số được chỉ định, lệnh sẽ được thực hiện mà không cần mở rộng trình bao.

16

exit([ result = 0])

Thoát khỏi chương trình, với kết quả là mã trạng thái được trả về.

17

exit!([ result = 0])

Diệt chương trình bỏ qua các xử lý thoát như ensure , v.v.

18

fail(...)

Xem tăng (...)

19

Float( obj)

Trả về obj sau khi chuyển đổi nó thành float. Các đối tượng dạng số được chuyển đổi trực tiếp; nil được chuyển đổi thành 0,0; chuỗi được chuyển đổi xem xét tiền tố cơ số 0x, 0b. Phần còn lại được chuyển đổi bằng cách sử dụng obj.to_f.

20

fork

fork {...}

Tạo một quy trình con. nil được trả về trong quy trình con và ID (số nguyên) của quy trình con được trả về trong quy trình mẹ. Nếu một khối được chỉ định, nó sẽ chạy trong tiến trình con.

21

format( fmt[, arg...])

Xem sprintf.

22

gets([ rs = $/])

Đọc tên tệp được chỉ định trong dòng lệnh hoặc một dòng từ đầu vào chuẩn. Chuỗi phân tách bản ghi có thể được chỉ định rõ ràng bằng rs.

23

global_variables

Trả về một mảng tên biến toàn cục.

24

gsub( x, y)

gsub( x) {...}

Thay thế tất cả các chuỗi khớp với x trong $_ with y. If a block is specified, matched strings are replaced with the result of the block. The modified result is assigned to $_

25

gsub!( x, y)

gsub!( x) {...}

Thực hiện thay thế tương tự như gsub, ngoại trừ chuỗi được thay đổi tại chỗ.

26

Integer( obj)

Trả về obj sau khi chuyển đổi nó thành số nguyên. Các đối tượng dạng số được chuyển đổi trực tiếp; nil được chuyển thành 0; chuỗi được chuyển đổi xem xét tiền tố cơ số 0x, 0b. Phần còn lại được chuyển đổi bằng cách sử dụng obj.to_i.

27

lambda {| x|...}

proc {| x|...}

lambda

proc

Chuyển đổi một khối thành một đối tượng Proc . Nếu không có khối nào được chỉ định, khối được liên kết với phương thức gọi sẽ được chuyển đổi.

28

load( file[, private = false])

Tải một chương trình Ruby từ tệp . Không giống như yêu cầu , nó không tải các thư viện mở rộng. Nếu privatetrue , chương trình được tải vào một mô-đun ẩn danh, do đó bảo vệ không gian tên của chương trình đang gọi.

29

local_variables

Trả về một mảng tên biến cục bộ.

30

loop {...}

Lặp lại một khối mã.

31

open( path[, mode = "r"])

open( path[, mode = "r"]) {| f|...}

Mở tệp . Nếu một khối được chỉ định, khối sẽ được thực thi với luồng đã mở được truyền dưới dạng đối số. Tệp được đóng tự động khi khối thoát. Nếu đường dẫn bắt đầu bằng dấu ngoặc kép |, chuỗi sau được chạy dưới dạng lệnh và luồng liên kết với quá trình đó được trả về.

32

p( obj)

Hiển thị đối tượng bằng cách sử dụng phương pháp kiểm tra của nó (thường được sử dụng để gỡ lỗi).

33

print([ arg...])

Bản in tranh luận với $ defout . Nếu không có đối số nào được chỉ định, giá trị của $ _ sẽ được in.

34

printf( fmt[, arg...])

Định dạng lập luận theo fmt bằng cách sử dụng sprintf và in kết quả ra $ defout . Để biết thông số kỹ thuật định dạng, hãy xem sprintf để biết chi tiết.

35

proc {| x|...}

proc

Xem lamda.

36

putc( c)

In một ký tự vào đầu ra mặc định ( $ defout ).

37

puts([ str])

In chuỗi vào đầu ra mặc định ( $ defout ). Nếu chuỗi không kết thúc bằng một dòng mới, thì một dòng mới sẽ được nối vào chuỗi.

38

raise(...)

fail(...)

Tăng một ngoại lệ. Giả sử RuntimeError nếu không có lớp ngoại lệ nào được chỉ định. Việc gọi raise mà không có đối số trong mệnh đề cứu sẽ làm tăng ngoại lệ. Làm như vậy bên ngoài điều khoản cứu sẽ gây ra lỗi RuntimeError không có thông báo .fail là một cái tên lỗi thời để tăng lương.

39

rand([ max = 0])

Tạo một số giả ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn giá trị tối đa. Nếu tối đa không được chỉ định hoặc được đặt thành 0, một số ngẫu nhiên được trả về dưới dạng số dấu phẩy động lớn hơn hoặc bằng 0 và nhỏ hơn 1. srand có thể được sử dụng để khởi tạo luồng giả ngẫu nhiên.

40

readline([ rs = $/])

Tương đương với get ngoại trừ nó làm tăng ngoại lệ EOFError khi đọc EOF.

41

readlines([ rs = $/])

Trả về một mảng chuỗi chứa tên tệp được chỉ định làm đối số dòng lệnh hoặc nội dung của đầu vào chuẩn.

42

require( lib)

Tải lib thư viện (bao gồm cả các thư viện mở rộng) khi nó được gọi lần đầu tiên. Yêu cầu sẽ không tải cùng một thư viện nhiều hơn một lần. Nếu không có phần mở rộng nào được chỉ định trong lib , hãy cố gắng thêm .rb, .so, v.v. vào nó.

43

scan( re)

scan( re) {|x|...}

Tương đương với $ _. Scan.

44

select( reads[, writes = nil[, excepts = nil[, timeout = nil]]])

Kiểm tra các thay đổi trong trạng thái của ba loại đối tượng IO đầu vào, đầu ra và ngoại lệ được chuyển dưới dạng mảng của các đối tượng IO. nil được chuyển cho các đối số không cần kiểm tra. Một mảng ba phần tử chứa các mảng của các đối tượng IO đã có các thay đổi về trạng thái được trả về. nil được trả lại vào thời gian chờ.

45

set_trace_func( proc)

Đặt một trình xử lý để truy tìm. proc có thể là một chuỗi hoặc đối tượng proc . set_trace_func được sử dụng bởi trình gỡ lỗi và trình biên dịch.

46

sleep([ sec])

Tạm dừng thực thi chương trình trong vài giây. Nếu giây không được chỉ định, chương trình sẽ bị tạm ngưng vĩnh viễn.

47

split([ sep[, max]])

Tương đương với $ _. Split.

48

sprintf( fmt[, arg...])

format( fmt[, arg...])

Trả về một chuỗi trong đó đối số được định dạng theo fmt. Các đặc tả định dạng về cơ bản giống như các đặc tả cho sprintf trong ngôn ngữ lập trình C. Các chỉ số chuyển đổi (% theo sau là chỉ định trường chuyển đổi) trong fmt được thay thế bằng chuỗi được định dạng của đối số tương ứng. Dưới đây là danh sách các chuyển đổi đã nộp trong phần tiếp theo.

49

srand([ seed])

Khởi tạo một mảng số ngẫu nhiên. Nếu hạt giống không được chỉ định, quá trình khởi tạo được thực hiện bằng thời gian và thông tin hệ thống khác cho hạt giống.

50

String( obj)

Trả về obj sau khi chuyển đổi nó thành một chuỗi bằng cách sử dụng obj.to_s.

51

syscall( sys[, arg...])

Gọi một chức năng gọi của hệ điều hành được chỉ định bởi hệ thống số . Số lượng và ý nghĩa của sys phụ thuộc vào hệ thống.

52

system( cmd[, arg...])

Thực thi cmd như một lời gọi đến dòng lệnh. Nếu nhiều đối số được chỉ định, lệnh sẽ được chạy trực tiếp mà không cần mở rộng trình bao. Trả về true nếu trạng thái trả về là 0 (thành công).

53

sub( x, y)

sub( x) {...}

Thay thế chuỗi đầu tiên khớp x trong $ _ bằng y. Nếu một khối được chỉ định, các chuỗi phù hợp sẽ được thay thế bằng kết quả của khối. Kết quả đã sửa đổi được gán cho $ _.

54

sub!( x, y)

sub!( x) {...}

Thực hiện thay thế tương tự như sub, ngoại trừ chuỗi được thay đổi tại chỗ.

55

test( test, f1[, f2])

Thực hiện các kiểm tra tệp khác nhau được chỉ định bởi kiểm tra ký tự . Để cải thiện khả năng đọc, bạn nên sử dụng các phương thức của lớp Tệp (ví dụ: Tệp :: có thể đọc được?) Thay vì hàm này. Danh sách các đối số được đưa ra bên dưới trong phần tiếp theo.

56

throw( tag[, value = nil])

Chuyển đến hàm bắt đang chờ với biểu tượng hoặc thẻ chuỗi . value là giá trị trả về được sử dụng bởi catch .

57

trace_var( var, cmd)

trace_var( var) {...}

Đặt theo dõi cho một biến toàn cục. Tên biến được chỉ định dưới dạng ký hiệu. cmd có thể là một chuỗi hoặc đối tượng Proc.

58

trap( sig, cmd)

trap( sig) {...}

Đặt một trình xử lý tín hiệu. sig có thể là một chuỗi (như SIGUSR1) hoặc một số nguyên. SIG có thể bị bỏ qua khỏi tên tín hiệu. Bộ xử lý tín hiệu cho tín hiệu EXIT hoặc tín hiệu số 0 được gọi ngay trước khi kết thúc quá trình.

59

untrace_var( var[, cmd])

Xóa truy tìm biến toàn cục. Nếu cmd được chỉ định, chỉ lệnh đó bị loại bỏ.

Hàm cho số

Đây là danh sách các Hàm tích hợp liên quan đến số. Chúng nên được sử dụng như sau:

#!/usr/bin/ruby

num = 12.40
puts num.floor      # 12
puts num + 10       # 22.40
puts num.integer?   # false  as num is a float.

Điều này sẽ tạo ra kết quả sau:

12
22.4
false
Sr.No. Phương pháp & Mô tả
1

n + num

n - num

n * num

n / num

Thực hiện các phép tính số học: cộng, trừ, nhân và chia.

2

n % num

Trả về môđun của n.

3

n ** num

Luỹ thừa.

4

n.abs

Trả về giá trị tuyệt đối của n.

5

n.ceil

Trả về số nguyên nhỏ nhất lớn hơn hoặc bằng n.

6

n.coerce( num)

Trả về một mảng chứa num và n có thể được chuyển đổi thành một kiểu cho phép chúng hoạt động lẫn nhau. Được sử dụng trong chuyển đổi kiểu tự động trong toán tử số.

7

n.divmod( num)

Trả về một mảng chứa thương và môđun từ phép chia n cho num.

số 8

n.floor

Trả về số nguyên lớn nhất nhỏ hơn hoặc bằng n.

9

n.integer?

Trả về true nếu n là số nguyên.

10

n.modulo( num)

Trả về mô đun nhận được bằng cách chia n cho num và làm tròn thương số với sàn

11

n.nonzero?

Trả về n nếu nó không phải là 0, ngược lại là nil.

12

n.remainder( num)

Trả về phần còn lại thu được bằng cách chia n bởi numvà xóa số thập phân khỏi thương số. Cácresultn luôn luôn có cùng một dấu hiệu.

13

n.round

Trả về n được làm tròn thành số nguyên gần nhất.

14

n.truncate

Trả về n dưới dạng số nguyên đã xóa số thập phân.

15

n.zero?

Trả về 0 nếu n là 0.

16

n & num

n | num

n ^ num

Các phép toán theo chiều bit: VÀ, HOẶC, XOR và đảo ngược.

17

n << num

n >> num

Dịch trái bit và dịch chuyển phải.

18

n[num]

Trả về giá trị của numbit thứ từ bit quan trọng nhất, là n [0].

19

n.chr

Trả về một chuỗi chứa ký tự cho mã ký tự n.

20

n.next

n.succ

Trả về số nguyên tiếp theo sau n. Tương đương với n + 1.

21

n.size

Trả về số byte trong biểu diễn máy của n.

22

n.step( upto, step) {|n| ...}

Lặp lại khối từ n đến upto, tăng dần bởi step mỗi lần.

23

n.times {|n| ...}

Lặp lại khối n lần.

24

n.to_f

Chuyển đổi nthành một số dấu phẩy động. Chuyển đổi phao có thể làm mất thông tin chính xác.

25

n.to_int

Lợi nhuận n sau khi chuyển đổi thành số interger.

Các chức năng cho Float

Sr.No. Phương pháp & Mô tả
1

Float::induced_from(num)

Trả về kết quả chuyển đổi num thành số dấu phẩy động.

2

f.finite?

Trả về true nếu f không phải là vô hạn và f.nan là false.

3

f.infinite?

Trả về 1 nếu f là dương vô cùng, -1 nếu âm ở vô cùng hoặc nil nếu khác.

4

f.nan?

Trả về true nếu f không phải là số dấu phẩy động IEEE hợp lệ.

Các hàm cho Toán học

Sr.No. Phương pháp & Mô tả
1

atan2( x, y)

Tính tiếp tuyến của cung.

2

cos( x)

Tính cosin của x.

3

exp( x)

Tính một hàm số mũ (e được nâng lên thành lũy thừa của x).

4

frexp( x)

Trả về một mảng hai phần tử chứa phân số và số mũ được định danh của x.

5

ldexp( x, exp)

Trả về giá trị của x nhân 2 với lũy thừa của exp.

6

log( x)

Tính logarit tự nhiên của x.

7

log10( x)

Tính logarit cơ số 10 của x.

số 8

sin( x)

Tính sin của x.

9

sqrt( x)

Trả về căn bậc hai của x. x phải dương.

10

tan( x)

Tính tang của x.

Công cụ chỉ định trường chuyển đổi

Hàm sprintf (fmt [, arg ...]) và format (fmt [, arg ...]) trả về một chuỗi trong đó arg được định dạng theo fmt. Các đặc tả định dạng về cơ bản giống như các đặc tả cho sprintf trong ngôn ngữ lập trình C. Các chỉ số chuyển đổi (% theo sau là chỉ định trường chuyển đổi) trong fmt được thay thế bằng chuỗi được định dạng của đối số tương ứng.

Sr.No. Chỉ định & Mô tả
1

b

Số nguyên nhị phân

2

c

Một ký tự

3

d,i

Số nguyên thập phân

4

e

Kí hiệu hàm mũ (ví dụ: 2,44e6)

5

E

Kí hiệu hàm mũ (ví dụ: 2.44E6)

6

f

Số dấu phẩy động (ví dụ: 2,44)

7

g

sử dụng% e nếu số mũ nhỏ hơn -4,% f nếu không

số 8

G

sử dụng% E nếu số mũ nhỏ hơn -4,% f nếu không

9

o

Số nguyên bát phân

10

s

Chuỗi hoặc bất kỳ đối tượng nào được chuyển đổi bằng to_s

11

u

Số nguyên thập phân không dấu

12.

x

Số nguyên hệ thập lục phân (ví dụ: 39ff)

13

X

Số nguyên hệ thập lục phân (ví dụ: 39FF)

Sau đây là ví dụ sử dụng -

#!/usr/bin/ruby

str = sprintf("%s\n", "abc")   # => "abc\n" (simplest form)
puts str 

str = sprintf("d=%d", 42)      # => "d=42" (decimal output)
puts str 

str = sprintf("%04x", 255)     # => "00ff" (width 4, zero padded)
puts str 

str = sprintf("%8s", "hello")  # => " hello" (space padded)
puts str 

str = sprintf("%.2s", "hello") # => "he" (trimmed by precision)
puts str

Điều này sẽ tạo ra kết quả sau:

abc
d = 42
00ff
   hello
he

Kiểm tra các đối số của hàm

Kiểm tra chức năng (test, f1 [, f2]) thực hiện một trong các kiểm tra tệp sau được chỉ định bởi kiểm tra ký tự . Để cải thiện khả năng đọc, bạn nên sử dụng các phương thức của lớp Tệp (ví dụ: Tệp :: có thể đọc được?) Thay vì hàm này.

Sr.No. Lập luận & Mô tả
1

?r

F1 có thể đọc được bởi uid của người gọi hiệu quả không?

2

?w

F1 có thể ghi bởi uid của người gọi hiệu quả không?

3

?x

F1 có được thực thi bởi uid của người gọi hiệu quả không?

4

?o

F1 có thuộc sở hữu của uid hiệu quả của người gọi không?

5

?R

F1 có thể đọc được bởi uid thực của người gọi không?

6

?W

F1 có thể ghi bởi uid thực của người gọi không?

7

?X

F1 có được thực thi bởi uid thực của người gọi không?

số 8

?O

F1 có thuộc sở hữu của uid thực của người gọi không?

9

?e

F1 có tồn tại không?

10

?z

F1 có độ dài bằng không?

11

?s

Kích thước tệp là f1 (nil nếu 0)

12

?f

F1 có phải là một tập tin thông thường?

13

?d

F1 có phải là một thư mục?

14

?l

F1 có phải là một liên kết tượng trưng?

15

?p

F1 có phải là một đường ống được đặt tên (FIFO) không?

16

?S

F1 có phải là một ổ cắm?

17

?b

F1 có phải là thiết bị khối không?

18

?c

F1 có phải là thiết bị ký tự không?

19

?u

F1 có đặt bit setuid không?

20

?g

F1 có đặt bit setgid không?

21

?k

F1 có đặt bit dính không?

22

?M

Thời gian sửa đổi cuối cùng cho f1.

23

?A

Thời gian truy cập cuối cùng cho f1.

24

?C

Thời gian thay đổi inode cuối cùng cho f1.

Sr.No. Lập luận & Mô tả
1

?=

Thời gian thay đổi của f1 và f2 có bằng nhau không?

2

?>

Thời gian sửa đổi của f1 gần đây hơn f2?

3

?<

Thời gian sửa đổi của f1 có cũ hơn f2 không?

4

?-

F1 có phải là liên kết cứng với f2 không?

Sau đây là ví dụ sử dụng. Giả sử main.rb tồn tại với quyền đọc, ghi và không thực thi -

#!/usr/bin/ruby

puts test(?r, "main.rb" )   # => true
puts test(?w, "main.rb" )   # => true
puts test(?x, "main.rb" )   # => false

Điều này sẽ tạo ra kết quả sau:

true
false
false

Ruby - Các biến được xác định trước

Các biến được xác định trước của Ruby ảnh hưởng đến hành vi của toàn bộ chương trình, vì vậy việc sử dụng chúng trong các thư viện không được khuyến khích.

Các giá trị trong hầu hết các biến xác định trước có thể được truy cập bằng các phương tiện thay thế.

Bảng sau liệt kê tất cả các biến được xác định trước của Ruby.

Sr.No. Tên và mô tả biến
1

$!

Đối tượng ngoại lệ cuối cùng được nêu ra. Đối tượng ngoại lệ cũng có thể được truy cập bằng cách sử dụng => trong mệnh đề cứu hộ .

2

$@

Ngăn xếp backtrace cho ngoại lệ cuối cùng nâng lên. Thông tin backtrace ngăn xếp có thể được truy xuất bằng phương thức Exception # backtrace của ngoại lệ cuối cùng.

3

$/

Dấu phân tách bản ghi đầu vào (dòng mới theo mặc định). get, readline, v.v., lấy dấu phân tách bản ghi đầu vào của chúng làm đối số tùy chọn.

4

$\

Dấu phân tách bản ghi đầu ra (nil theo mặc định).

5

$,

Dấu phân tách đầu ra giữa các đối số để in và tham gia Mảng # (mặc định là nil). Bạn có thể chỉ định dấu phân tách một cách rõ ràng cho nối mảng #.

6

$;

Dấu phân tách mặc định để tách (không theo mặc định). Bạn có thể chỉ định dấu phân tách rõ ràng cho chuỗi # tách.

7

$.

Số dòng cuối cùng được đọc từ tệp đầu vào hiện tại. Tương đương với ARGF.lineno.

số 8

$<

Từ đồng nghĩa với ARGF.

9

$>

Từ đồng nghĩa với $ defout.

10

$0

Tên của chương trình Ruby hiện tại đang được thực thi.

11

$$

Quá trình pid của chương trình Ruby hiện tại đang được thực thi.

12

$?

Trạng thái thoát của quá trình cuối cùng đã kết thúc.

13

$:

Từ đồng nghĩa với $ LOAD_PATH.

14

$DEBUG

Đúng nếu tùy chọn dòng lệnh -d hoặc --debug được chỉ định.

15

$defout

Đầu ra đích cho printprintf ( $ stdout theo mặc định).

16

$F

Biến nhận đầu ra từ tách khi -a được chỉ định. Biến này được đặt nếu tùy chọn dòng lệnh -a được chỉ định cùng với tùy chọn -p hoặc -n.

17

$FILENAME

Tên của tệp hiện đang được đọc từ ARGF. Tương đương với ARGF.filename.

18

$LOAD_PATH

Một mảng chứa các thư mục được tìm kiếm khi tải các tệp có phương thức tải và yêu cầu.

19

$SAFE

Mức độ bảo mật

0 → Không có kiểm tra nào được thực hiện đối với dữ liệu được cung cấp bên ngoài (bị nhiễm bẩn). (mặc định)

1 → Các hoạt động tiềm ẩn nguy hiểm sử dụng dữ liệu bị nhiễm độc bị cấm.

2 → Các hoạt động tiềm ẩn nguy hiểm trên các quy trình và tệp bị cấm.

3 → Tất cả các đối tượng mới được tạo ra đều bị coi là bị nhiễm bẩn.

4 → Việc sửa đổi dữ liệu toàn cầu bị cấm.

20

$stdin

Đầu vào tiêu chuẩn (STDIN theo mặc định).

21

$stdout

Đầu ra tiêu chuẩn (STDOUT theo mặc định).

22

$stderr

Lỗi tiêu chuẩn (STDERR theo mặc định).

23

$VERBOSE

Đúng nếu tùy chọn dòng lệnh -v, -w hoặc --verbose được chỉ định.

24

$- x

Giá trị của tùy chọn trình thông dịch -x (x = 0, a, d, F, i, K, l, p, v). Các tùy chọn này được liệt kê bên dưới

25

$-0

Giá trị của tùy chọn trình thông dịch -x và bí danh là $ /.

26

$-a

Giá trị của tùy chọn trình thông dịch -x và true nếu tùy chọn -a được đặt. Chỉ đọc.

27

$-d

Giá trị của tùy chọn trình thông dịch -x và bí danh của $ DEBUG

28

$-F

Giá trị của tùy chọn trình thông dịch -x và bí danh của $ ;.

29

$-i

Giá trị của tùy chọn trình thông dịch -x và ở chế độ chỉnh sửa tại chỗ, giữ phần mở rộng, nếu không thì không. Có thể bật hoặc tắt chế độ chỉnh sửa tại chỗ.

30

$-I

Giá trị của tùy chọn trình thông dịch -x và bí danh của $:.

31

$-l

Giá trị của tùy chọn thông dịch -x và true nếu tùy chọn -lis được đặt. Chỉ đọc.

32

$-p

Giá trị của tùy chọn thông dịch -x và true nếu tùy chọn -pis được đặt. Chỉ đọc.

33

$_

Biến cục bộ, chuỗi cuối cùng được đọc bởi get hoặc readline trong phạm vi hiện tại.

34

$~

Biến cục bộ, MatchData liên quan đến trận đấu cuối cùng. Phương thức so khớp Regex # trả về thông tin kết hợp cuối cùng.

35

$ n ($1, $2, $3...)

Chuỗi được khớp trong nhóm thứ n của lần khớp mẫu cuối cùng. Tương đương với m [n], trong đó m là một đối tượng MatchData .

36

$&

Chuỗi được khớp trong lần khớp mẫu cuối cùng. Tương đương với m [0], trong đó m là một đối tượng MatchData .

37

$`

Chuỗi trước khớp trong lần khớp mẫu cuối cùng. Tương đương với m.pre_match, trong đó m là một đối tượng MatchData .

38

$'

Chuỗi theo sau khớp trong khớp mẫu cuối cùng. Tương đương với m.post_match, trong đó m là một đối tượng MatchData.

39

$+

Chuỗi tương ứng với nhóm được khớp thành công cuối cùng trong lần khớp mẫu cuối cùng.

Ruby - Các hằng số được xác định trước

Bảng sau liệt kê tất cả các Hằng số được xác định trước của Ruby:

NOTE- TRUE, FALSE và NIL tương thích ngược. Nên sử dụng true, false và nil.

Sr.No. Tên & Mô tả Không đổi
1

TRUE

Từ đồng nghĩa với true.

2

FALSE

Từ đồng nghĩa với false.

3

NIL

Từ đồng nghĩa với nil.

4

ARGF

Một đối tượng cung cấp quyền truy cập vào nối ảo của các tệp được truyền dưới dạng đối số dòng lệnh hoặc đầu vào chuẩn nếu không có đối số dòng lệnh. Một từ đồng nghĩa với $ <.

5

ARGV

Một mảng chứa các đối số dòng lệnh được truyền vào chương trình. Từ đồng nghĩa với $ *.

6

DATA

Luồng đầu vào để đọc các dòng mã sau lệnh __END__. Không được xác định nếu __END__ không có trong mã.

7

ENV

Một đối tượng dạng băm chứa các biến môi trường của chương trình. ENV có thể được xử lý như một hàm băm.

số 8

RUBY_PLATFORM

Một chuỗi chỉ ra nền tảng của trình thông dịch Ruby.

9

RUBY_RELEASE_DATE

Một chuỗi cho biết ngày phát hành của trình thông dịch Ruby

10

RUBY_VERSION

Một chuỗi chỉ ra phiên bản của trình thông dịch Ruby.

11

STDERR

Dòng xuất lỗi chuẩn. Giá trị mặc định của $ stderr .

12

STDIN

Dòng đầu vào tiêu chuẩn. Giá trị mặc định của $ stdin.

13

STDOUT

Dòng đầu ra tiêu chuẩn. Giá trị mặc định của $ stdout.

14

TOPLEVEL_BINDING

Một đối tượng ràng buộc ở cấp cao nhất của Ruby.

Ruby - Công cụ liên kết

Công cụ Ruby tiêu chuẩn

Bản phân phối tiêu chuẩn của Ruby chứa các công cụ hữu ích cùng với trình thông dịch và các thư viện tiêu chuẩn -

Những công cụ này giúp bạn gỡ lỗi và cải thiện các chương trình Ruby của mình mà không tốn nhiều công sức. Hướng dẫn này sẽ cung cấp cho bạn một khởi đầu rất tốt với các công cụ này.

  • RubyGems -

    RubyGems là một tiện ích gói dành cho Ruby, cài đặt các gói phần mềm Ruby và cập nhật chúng.

  • Ruby Debugger -

    Để giúp xử lý lỗi, bản phân phối chuẩn của Ruby bao gồm một trình gỡ lỗi. Điều này rất giống với tiện ích gdb , có thể được sử dụng để gỡ lỗi các chương trình phức tạp.

  • Interactive Ruby (irb) -

    irb (Interactive Ruby) được phát triển bởi Keiju Ishitsuka. Nó cho phép bạn nhập các lệnh tại dấu nhắc và yêu cầu trình thông dịch trả lời như thể bạn đang thực hiện một chương trình. irb rất hữu ích để thử nghiệm hoặc khám phá Ruby.

  • Ruby Profiler -

    Ruby profiler giúp bạn cải thiện hiệu suất của một chương trình chậm bằng cách tìm ra điểm nghẽn.

Các công cụ Ruby bổ sung

Có những công cụ hữu ích khác không đi kèm với bản phân phối chuẩn Ruby. Tuy nhiên, bạn cần phải tự cài đặt chúng.

  • eRuby: Embeded Ruby -

    eRuby là viết tắt của Ruby nhúng. Đó là một công cụ nhúng các đoạn mã Ruby vào các tệp khác, chẳng hạn như tệp HTML tương tự như ASP, JSP và PHP.

  • ri: Ruby Interactive Reference -

    Khi bạn có câu hỏi về hoạt động của một phương thức nào đó, bạn có thể gọi ri để đọc phần giải thích ngắn gọn của phương thức đó.

Để biết thêm thông tin về công cụ và tài nguyên Ruby, hãy xem Ruby Useful Resources.