_If you wish to report errors or suggest improvements for this FAQ,
please go to our
[GitHub repository](https://github.com/ruby/www.ruby-lang.org/)
and open an issue or pull request._


## Các tính năng khác

### `a ? b : c` có nghĩa là gì?

Đây là cái gọi là "toán tử ba ngôi" và tương đương với
`if a then b else c end`.

### Làm thế nào để đếm số dòng trong một tệp?

Đoạn mã sau có thể cho kết quả nhanh nhất.

~~~
File.readlines("example").size  # => 3
~~~

### `MatchData#begin` và `MatchData#end` trả về gì?

Chúng hoạt động với `$~`, và trả về chỉ mục bắt đầu và chỉ mục kết thúc
của dữ liệu khớp trong chuỗi gốc. Xem ví dụ trong
[mở rộng tab](../9/#tab-expansion).

### Làm thế nào để tính tổng các phần tử trong một mảng?

<div class="not-prose bg-ruby-100 dark:bg-ruby-800 rounded-lg p-8 my-6">
  <div class="flex items-start gap-3">
    <svg class="w-6 h-6 text-ruby-700 dark:text-ruby-200 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
      <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
    </svg>
    <p class="text-sm text-ruby-700 dark:text-ruby-200 italic">
      This section or parts of it might be out-dated or in need of confirmation.
    </p>
  </div>
</div>


Thay vì giải quyết bài toán cụ thể, hãy giải quyết trường hợp tổng quát.
Điều đầu tiên chúng ta sẽ làm là tạo một phương thức duyệt qua
một đối tượng `Enumerable` và thu thập một kết quả duy nhất. Smalltalk gọi
phương thức đó là inject, nên chúng ta cũng sẽ gọi như vậy:

~~~
module Enumerable

  # inject(n) {|n, i| ...}
  def inject(n)
    each {|i| n = yield(n, i) }

    n
  end
end
~~~

Lưu ý cách chúng ta thêm phương thức vào `Enumerable`. Điều này có nghĩa
là bất cứ thứ gì include Enumerable giờ đều có thể sử dụng `inject`. Nhưng
làm thế nào để sử dụng nó? Nó nhận một đối số duy nhất `n` và một block.
Với mỗi phần tử trong đối tượng đang được duyệt, nó gọi block, truyền vào
`n` và chính phần tử đó. Kết quả của block được gán lại cho `n`. Vì vậy,
để định nghĩa `sum`, chúng ta có thể viết:

~~~
module Enumerable
  def sum
    inject(0) {|n, i| n + i }
  end
end

[1,3,5,7,9].sum  # => 25
(1..100).sum     # => 5050
~~~

### Làm thế nào để sử dụng continuation?

<div class="not-prose bg-ruby-100 dark:bg-ruby-800 rounded-lg p-8 my-6">
  <div class="flex items-start gap-3">
    <svg class="w-6 h-6 text-ruby-700 dark:text-ruby-200 flex-shrink-0 mt-0.5" fill="currentColor" viewBox="0 0 20 20">
      <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
    </svg>
    <p class="text-sm text-ruby-700 dark:text-ruby-200 italic">
      This section or parts of it might be out-dated or in need of confirmation.
    </p>
  </div>
</div>


Continuation trong Ruby cho phép bạn tạo một đối tượng đại diện cho một vị
trí trong chương trình Ruby, và sau đó quay lại vị trí đó bất cứ lúc nào
(ngay cả khi nó dường như đã ra khỏi phạm vi). Continuation có thể được sử
dụng để triển khai các cấu trúc điều khiển phức tạp, nhưng thường hữu ích
hơn như một cách để làm rối người khác.

Trong [\[ruby-talk:4482\]][ruby-talk:4482], Jim Weirich đã đăng các ví dụ
sau về continuation:

~~~
# --------------------------------------------------------------------
# Simple Producer/Consumer
# --------------------------------------------------------------------
# Connect a simple counting task and a printing task together using
# continuations.
#
# Usage:  count(limit)

def count_task(count, consumer)
  (1..count).each do |i|
    callcc {|cc| consumer.call cc, i }
  end
  nil
end

def print_task()
  producer, i = callcc { |cc| return cc }
  print "#{i} "
  callcc { |cc| producer.call }
end

def count(limit)
  count_task(limit, print_task())
  print "\n"
end
~~~


~~~
# --------------------------------------------------------------------
# Filtering Out Multiples of a Given Number
# --------------------------------------------------------------------
# Create a filter that is both a consumer and producer. Insert it
# between the counting task and the printing task.
#
# Usage:  omit(2, limit)

def filter_task(factor, consumer)
  producer, i = callcc { |cc| return cc }
  if (i%factor) != 0 then
    callcc { |cc| consumer.call cc, i }
  end
  producer.call
end

def omit(factor, limit)
  printer = print_task()
  filter = filter_task(factor, printer)
  count_task(limit, filter)
  print "\n"
end
~~~


~~~
# --------------------------------------------------------------------
# Prime Number Generator
# --------------------------------------------------------------------
# Create a prime number generator. When a new prime number is
# discovered, dynamically add a new multiple filter to the chain of
# producers and consumers.
#
# Usage:  primes(limit)

def prime_task(consumer)
  producer, i = callcc { |cc| return cc }
  if i >= 2 then
    callcc { |cc| consumer.call cc, i }
    consumer = filter_task(i, consumer)
  end
  producer.call
end

def primes(limit)
  printer = print_task()
  primes = prime_task(printer)
  count_task(limit, primes)
  print "\n"
end
~~~

[ruby-talk:4482]: https://blade.ruby-lang.org/ruby-talk/4482
