Computer >> Máy Tính >  >> Lập trình >> Ruby

Đầu vào và đầu ra (IO) trong Ruby:Hướng dẫn cuối cùng

I / O là viết tắt của Input / Output.

Bằng đầu vào, chúng tôi có nghĩa là tất cả dữ liệu và thông tin đi vào một thứ gì đó (máy tính, phương pháp Ruby, bộ não của bạn).

Ví dụ về đầu vào :

  • Các phím bấm của bạn trên bàn phím
  • Nhấp chuột
  • Sách bạn đã đọc

Theo đầu ra, chúng tôi có nghĩa là mọi thứ xuất hiện là kết quả của đầu vào.

Ví dụ về đầu ra :

  • Kết quả của 1 + 1
  • Viết tóm tắt một bài báo bạn đã đọc
  • Cà phê

Trong Ruby, khi nói về i / o, chúng ta thường đề cập đến việc đọc tệp, làm việc với ổ cắm mạng và in thông tin trên màn hình.

Hiểu Lớp IO

IO cũng là một lớp trong Ruby.

Nó là lớp cha cho các đối tượng khác như File &Socket .

Tất cả các đối tượng IO đều có các hoạt động này :

  • mở / đóng
  • đọc
  • viết

Các đối tượng IO dựa trên trình mô tả tệp .

Mọi quy trình đang chạy trong máy tính của bạn đều có một bảng thông tin nội bộ.

Một phần của bảng này bao gồm danh sách các bộ mô tả tệp.

Bộ mô tả tệp là ánh xạ giữa số nguyên và tên tệp .

Bạn có thể xem danh sách các trình mô tả tệp này trong Linux.

Với lệnh này :

# Assuming you have irb open on another window

ls -lh /proc/`pgrep irb`/fd/

# lrwx------ 1 jesus jesus 64 Feb  3 15:54 0 -> /dev/pts/3
# lrwx------ 1 jesus jesus 64 Feb  3 15:54 1 -> /dev/pts/3
# lrwx------ 1 jesus jesus 64 Feb  3 15:54 2 -> /dev/pts/3

Bạn có thể tạo bộ mô tả tệp mới trong Ruby bằng sysopen phương pháp.

Ví dụ :

fd = IO.sysopen('/dev/null', 'w')

# 10

Bây giờ bạn có thể mở một kênh giao tiếp với bộ mô tả tệp này (10 ).

Như thế này :

io = IO.new(fd)

Và viết thư cho nó :

io << 'orange'

Lưu ý rằng IO không quan tâm nếu trình mô tả tệp của bạn ánh xạ tới tệp thực, thiết bị (như đĩa cứng) hay ổ cắm mạng.

Cách mở trình mô tả tệp để viết

Khi bạn tạo bộ mô tả tệp mới bằng sysopen hoặc mở tệp bằng File.open , bạn có một vài lựa chọn.

Theo mặc định, giao tiếp ở chế độ chỉ đọc.

Bạn có thể chỉ định một chế độ :

  • r (đọc, mặc định)
  • w (ghi)
  • w+ (đọc và viết)
  • a (nối thêm)

Ví dụ :

fd = IO.sysopen('/dev/tty1', 'w+')

Thao tác này sẽ mở ra /dev/tty1 với chế độ đọc + ghi.

3 Luồng IO Chuẩn

Khi bạn mở một chương trình mới (trình soạn thảo, thiết bị đầu cuối, trình thông dịch Ruby, v.v.), chương trình đó sẽ mở 3 kênh giao tiếp theo mặc định.

3 bộ mô tả tệp.

Họ là :

  • stdin (đầu vào)
  • stdout (đầu ra)
  • stderr (lỗi)

Trong Ruby, bạn có thể truy cập trực tiếp những thứ này bằng cách sử dụng dạng hằng số của chúng hoặc dạng biến toàn cục của chúng.

Ví dụ :

$stdout << "abc\n"

Khi bạn ghi vào $stdout , nó cũng giống như cách gọi phương thức put.

Đầu ra tiêu chuẩn được liên kết với thiết bị đầu cuối của bạn.

lrwx------ 1 jesus jesus 64 Feb  3 15:54 0 -> /dev/pts/3

/dev/pts/3 này là một thiết bị ảo mà thiết bị đầu cuối của bạn đọc từ đó để hiển thị văn bản trên màn hình.

Lỗi tiêu chuẩn cũng được sử dụng cho đầu ra, nhưng nó cho phép thiết bị đầu cuối của bạn có cơ hội trình bày nội dung này theo một cách khác, chẳng hạn như bằng phông chữ lớn hơn hoặc bằng màu khác với văn bản thông thường.

Bạn có thể sử dụng warn để in ra lỗi chuẩn.

Đầu vào chuẩn là nơi đầu vào của người dùng được đọc từ đó.

Bạn có thể sử dụng gets phương pháp để đọc từ đầu vào chuẩn.

Cách xóa STDOUT &Tắt bộ đệm

Các đối tượng IO có bộ đệm bên trong.

Một lượng dữ liệu đầu vào nhất định sẽ được lưu trước khi có thể đọc được .

Đó là lý do tại sao đôi khi bạn sử dụng puts ...

Nhưng bạn không thấy gì cho đến khi chương trình kết thúc hoặc bộ đệm đầy!

Bạn có thể tắt tính năng đệm như thế này :

$stdout.sync = true

Hoặc bạn có thể làm sạch bộ đệm theo cách thủ công :

$stdout.flush

Khi bộ đệm bị vô hiệu hóa, bạn sẽ thấy đầu ra mà không cần phải đợi.

Đọc trong Chunks

Khi bạn đang đọc từ một đối tượng IO, bạn read cho đến khi luồng kết thúc bằng tín hiệu END-OF-FILE (EOF), luồng đã bị đóng hoặc bạn nhận được một lượng byte cụ thể.

Đối với lập trình mạng và các tệp lớn, sẽ hữu ích khi đọc từng phần nhỏ.

Bạn có thể đọc những phần như thế này :

data = ""

until io.eof?
  data << io.read(2048)
end

Với mã này, bạn có thể xử lý dữ liệu khi có sẵn mà không cần phải đợi toàn bộ quá trình tải xuống hoàn tất.

Lưu ý rằng eof? sẽ "chặn".

Chặn có nghĩa là mã của bạn sẽ chuyển sang trạng thái ngủ cho đến khi hệ điều hành báo hiệu rằng có dữ liệu mới sẽ được đọc .

Cách sử dụng ống IO để giao tiếp hai chiều

Ruby cho phép bạn tạo các đường ống.

Đường ống là một cặp bộ mô tả tệp được kết nối với nhau.

Điều này được sử dụng cho Giao tiếp giữa các quá trình (IPC).

Ví dụ :

read, write = IO.pipe

Bạn có thể sử dụng điều này với fork (không có sẵn trong Windows) để tạo bản sao của quy trình hiện tại.

Hai quy trình này có thể giao tiếp bằng cách sử dụng đường ống.

Ví dụ :

if fork
  write.close

  puts "Message received: #{read.gets}"

  read.close
else
  read.close

  write << "Buy some bananas!"

  write.close
end

Kết quả dẫn đến :

# Message received: Buy some bananas!

Cách sử dụng phương pháp mở hạt nhân

Ruby có một open rất linh hoạt phương pháp.

Nó cho phép bạn mở tệp và đọc dữ liệu từ URL và thậm chí mở đường dẫn để chạy các lệnh bên ngoài.

Ví dụ :

open "abc.txt"

Đó là lý do tại sao nên tránh sử dụng phương pháp này .

Đó là một rủi ro bảo mật mà nó có thể làm tất cả những điều này.

Thay vào đó, tốt hơn là sử dụng open cụ thể phương pháp mà bạn cần.

Ví dụ :

File.open           # File
IO.popen            # Process open
URI.parse(...).open # URL open

Tất cả những thứ này đều trả về một IO đối tượng.

Tóm tắt

Bạn đã học về đầu vào / đầu ra trong Ruby! Bạn đã học về trình mô tả tệp, IO lớp, đệm, đọc theo khối &chuẩn IO luồng.

Đầu vào và đầu ra (IO) trong Ruby:Hướng dẫn cuối cùng

Đừng quên chia sẻ bài viết này nếu bạn thích nó.

Cảm ơn vì đã đọc.