08/12/2019, 00:23

Các câu hỏi phỏng vấn Ruby on Rails Developer - Phần 2

Đặc điểm của ngôn ngữ Ruby? Hướng đối tượng Thông dịch Phiên bản hiện nay 2.6.5 Tất cả đều là object? Mọi thứ trong Ruby đều là object, từ các giá trị boolean, number, ... thậm chí là class Các kiểu dữ liệu Number VD: 1.object Trước ruby 2.4 thuộc class FixNum, BigNum ...

Đặc điểm của ngôn ngữ Ruby?

Hướng đối tượng
Thông dịch
Phiên bản hiện nay 2.6.5
Tất cả đều là object?
Mọi thứ trong Ruby đều là object, từ các giá trị boolean, number, ... thậm chí là class

Các kiểu dữ liệu

Number
VD: 1.object
Trước ruby 2.4 thuộc class FixNum, BigNum
Từ 2.4 trở đi thuộc class Integer
String khi tạo 2 biến tên giống nhau thì có 2 ô nhớ
Symbol tạo 2 biến thì sẽ chỉ có 1 ô nhớ
Range 1...4 (1,2,3) và 1..4 (1,2,3,4)
Hash khi khai báo cùng id 2 giá trị -> tự động lấy giá trị thứ 2. Thêm 1 ob vào hash: hash[mới], + , merge,...

Array

Map -> sau khi chạy hàm each thì giá trị ban đầu sẽ không thay đổi
Map! -> sau khi chạy hàm each thì giá trị ban đầu sẽ thay đổi
Collection -> sau khi chạy hàm each thì giá trị ban đầu sẽ không thay đổi
Collection! -> sau khi chạy hàm each thì giá trị ban đầu sẽ thay đổi

Các loại biến?

Biến thực thể @a
Biến class @@a
Biến toàn cục $a
Biến cục bộ a
Hằng -> có thay đổi
Phạm vi biến
Biến thực thể có ý nghĩa trong instance method
Biến class có ý nghĩa trong instance method và class method

Làm thế nào để getter và setter trong Ruby?

attr_reader là một phương thức ruby tạo getter cho biến
attr_writer là một phương thức ruby tạo setter cho biến
attr_accessible là một phương thức Rails về cơ bản chỉ định một danh sách trắng các thuộc tính mô hình có thể được thiết lập thông qua gán khối
attr_accessor là một phương thức ruby tạo getter / setter cho biến

Class method và Instance method trong Ruby?

Class method được khai báo bằng từ khóa self, class self, tên class.method

self.bar
class << self
  def bar
    puts 'class method'
  end
end

Sự khác biệt chính là các instance method chỉ làm việc trên một thể hiện của một lớp, do đó bạn phải tạo ra một thể hiện của các lớp để sử dụng chúng. Class method chỉ có thể được gọi trên các lớp còn instance method chỉ có thể được gọi trên một thể hiện của một lớp. Class method chỉ có thể được gọi trên các lớp
Các instance method chỉ làm việc trên một thể hiện của một lớp, do đó bạn phải tạo ra một thể hiện của các lớp để sử dụng chúng.

So sánh: include và extend Module

extends

methods từ module được extends vào được gọi như là class method
extends is a public method

include

methods từ module được include vào được gọi như là instance methods
include is a private method

Blocks, Procs, Lambdas trong Ruby. So sánh chúng"

Block chỉ là tập hợp câu lệnh, không phải là đối tượng, chỉ truyền được 1 block vào method.
Proc là đối tượng đại diện cho block
Lambda là function được gọi từ bên trong function, và những gì lambda làm hoàn toàn độc lập với function gọi nó => hoạt động của nó giống như một global function.

So sánh procs vs blocks

Block không phải là đối tượng, chỉ truyền được 1 block vào method. Proc là đối tượng, truyền được nhiều proc vào method

So sánh procs vs lambdas

Về cơ bản thì chức năng của Proc và Lambda gần như giống hệt nhau (thực chất Lambda chính là một đối tượng của Proc), nhưng chúng có 2 điểm khác nhau cơ bản.

  1. Lambda kiểm tra số lượng tham số đầu vào và trả về một ArgumentError nếu số lượng truyền vào không đúng với tham số được khai báo trong method của nó; còn proc thì không kiểm tra số lượng tham số đầu vào và mặc định tham số đó là nil.
  2. Khi chạy đến return thì proc ngay lập tức trả về giá trị, còn lambda thì vẫn chạy tiếp các câu lệnh dưới return trong phương thức.
Phân biệt map, select, collect, reject, detect, each, inject

map, select chạy qua từng phần tử trong mảng và thực hiện câu lệnh trong block, sau đó return về mảng kết quả.
map! thay đổi mảng ban đầu
collect: return về 1 mảng từ mảng ban đầu với điều kiện trong block
collect! thay đổi mảng ban đầu
reject: thì trái lại với collect
detect: return về giá trị thỏa mãn trong block, nếu có nhiều giá trị thì chỉ lấy giá trị gần nhất
inject vs each: đơn giản là chạy qua từng phần tử và thực hiện các câu lệnh trong block

0