[Thảo Luận] Cho hỏi về Ruby

kirby3012kirby3012 Posts: 27Registered
edited August 2019 in Lập Trình
Dạo này mình đang nghiên cứu cái Ruby nhờ Web này
Và lúc tập thì nó có một đoạn code:
books = {}
books["Gravity's Rainbow] = :spendid
books["A horror in normal life"] = :disastrous
ratings = Hash.new(0)
books.values.each { |rate| ratings[rate] += 1 }

Mình không hiểu khúc
ratings = Hash.new(0)
books.values.each { |rate| ratings[rate] += 1 }

Có bạn nào có thể giải thích cho mình được không?
Và cho mình hỏi luôn
5.times { print "A" }
cho cùng kết quả
"A" * 5
nhưng
5 * 2
lại không cho cùng kết quả với
5.times { 2 }
Xin cảm ơn mọi người nhiều.
«1

Comments

  • KangKang Posts: 453Registered
    ko liên quan nhưng nếu bạn mún học ruby để viết script thì nên học thẳng rssg, nhưng qđ là ở bạn, đây là yk của mình thôi
    kirby3012 wrote:
    5.times { print "A" }
    
    cho cùng kết quả
    "A" * 5
    
    nhưng
    5 * 2
    
    lại không cho cùng kết quả với
    5.times { 2 }
    
    Xin cảm ơn mọi người nhiều.

    hình như là kiểu chuỗi nó in ra 5 chữ a, còn kiểu số nó ra 2^5 thì phải
  • NagiNagi Posts: 589Registered
    kirby3012 wrote:
    Và cho mình hỏi luôn
    5.times { print "A" }
    
    cho cùng kết quả
    "A" * 5
    
    nhưng
    5 * 2
    
    lại không cho cùng kết quả với
    5.times { 2 }
    
    Xin cảm ơn mọi người nhiều.
    Print là lệnh in... 5.times print "A" thì in chữ A 5 lần
    5*2 nó là toán tử rõ ràng, nên kết quả phải trả về số là 10
  • kirby3012kirby3012 Posts: 27Registered
    Vậy lệnh .times thì phải sử dụng nó như thế nào ?
  • KangKang Posts: 453Registered
    times giống lệnh for
    ví dụ 5.times = for i in 0..4
  • VistrifaVistrifa Posts: 87Registered
    Mình ko biết gì về ruby nhưng nếu .times là lệnh lặp với số lần biết trước thì
    num.times { câu lệnh }
  • David ChaseDavid Chase Posts: 1,766Registered
    Ruby rắc rối vãi
    nhìn các bác nói t chẳng hiểu gì cả haha
  • slucis7593slucis7593 Posts: 544Registered
    Nếu bạn muốn in ra 5 số 2 thì phải dùng ký tự "2" chứ không phải số 2.
    2 dòng lệnh dưới đây sẽ có kết quả giống nhau là đều in ra 5 số 2.
    print '2' * 5
    5.times { print '2' }
    
  • kirby3012kirby3012 Posts: 27Registered
    Vậy lệnh n.times là để lặp lại lệnh n lần.
    Còn khúc
    ratings = Hash.new(0)
    books.values.each { |rate| ratings[rate] += 1 }
    
    có nghĩa là sao?
    mình hiểu cái books.values.each là cho từng giá trị của books
    còn mấy cái Hash.new(0) với { |rate| ratings[rate] += 1 } là sao?
  • KangKang Posts: 453Registered
    Ruby rắc rối vãi
    nhìn các bác nói t chẳng hiểu gì cả haha

    Mót ko đc sờ băm hé :v

    1 link cho bạn :v
    http://www.techotopia.com/index.php/Ruby_Essentials
  • slucis7593slucis7593 Posts: 544Registered
    Bạn có biết hash là gì không?
    Có thì bạn xem code luôn, nếu không mình nói qua nhé.
    Nó giống như 1 cái từ điển có cấu trúc như sau:
    books[key] = value
    
    - books là tên hash
    - key là khóa
    - value là giá trị
    Nhìn cũng khá là giống 1 cái mảng (array) nhỉ, key giống như index(chỉ số 1, 2, 3....) của array vậy, nhưng key ở đây không phải chỉ có thể là số mà có thể là string hay 1 số kiểu khác, value cũng
    vậy. Giống như là nhóm 2 thằng thành 1 cặp thôi, biết thằng này thì biết ngay thằng còn lại là gì. :D
    Còn đây mình xin giải thích cái code:
    books = {} # khai báo 1 cái hash rỗng
    books["Gravity's Rainbow"] = :spendid # định nghĩa 1 cái key có kiểu string = "Gravity's Rainbow" & value = :spendid
    books["A horror in normal life"] = :disastrous # tương tự key = "A horror in normal life" & value = :disastrous
    ratings = Hash.new(0) # giống như trên cũng khai báo 1 cái hash rỗng, nhưng cái này gọi hàm initialize (hàm khởi tạo) của hash và truyền tham số 0 cho hàm
    books.values.each { |rate| ratings[rate] += 1 } 
    # Tạo vòng lặp duyệt qua tất cả các value của books (cụ thể ở đây, như ở trên định nghĩa là có 2 cái gồm :spendid và :disastrous) 
    # Bây giờ thì dùng value của books làm key cho cái hash ratings
    # += 1 ở đây thì value của 2 cái key vừa định nghĩa = 1, bạn có thể thay thế += 1 bằng '= 4', '= "Hello"' hay gì đó tùy bạn.
    
  • kirby3012kirby3012 Posts: 27Registered
    Vậy books = {} và books = Hash.new() có tương đương nhau không?
    và |rate| trong cái code đó có vai trò gì?
  • slucis7593slucis7593 Posts: 544Registered
    1. Theo như ở trên thì có vẻ là tương đương :D
    2. |rate| ở đây chính là value tại vòng lặp hiện tại của cái vòng lặp books.values.each đó :)
    trong trường hợp này:
    1. vòng lặp đầu tiên: |rate| = :spendid
    2. vòng lặp thứ 2: |rate| = :disastrous
    Không có vòng lặp thứ 3 bởi vì books chỉ có 2 cái values mà thôi :D
  • kirby3012kirby3012 Posts: 27Registered
    Vậy cái đó có nghĩa là mỗi loại value của books sẽ tính là một rate. Và khúc sau có nghĩa là ratings[cho một value] += 1 ?
    Mình nói đúng không?
  • slucis7593slucis7593 Posts: 544Registered
    :D uh, mỗi cái value của books sẽ được gán cho 1 cái biến tên là 'rate', sau đó cái 'rate' này được dùng làm key cho hash 'ratings': ratings[rate] += 1
  • kirby3012kirby3012 Posts: 27Registered
    Vậy bạn có thể cho mình hỏi luôn là Dir và entries có tác dụng gì không?
    Tại mình thấy có ví dụ ghi Dir.entries "/"
Sign In or Register to comment.