Apa perbedaan antara sertakan dan butuhkan di Ruby?


Jawaban:


543

Apa perbedaan antara "sertakan" dan "perlu" di Ruby?

Menjawab:

Metode yang termasuk dan memerlukan melakukan hal-hal yang sangat berbeda.

Metode yang diperlukan melakukan apa yang dimasukkan dalam sebagian besar bahasa pemrograman lain: jalankan file lain. Itu juga melacak apa yang Anda minta di masa lalu dan tidak akan memerlukan file yang sama dua kali. Untuk menjalankan file lain tanpa fungsi tambahan ini, Anda dapat menggunakan metode memuat.

Metode include mengambil semua metode dari modul lain dan memasukkannya ke dalam modul saat ini. Ini adalah hal tingkat bahasa yang bertentangan dengan hal tingkat file seperti yang diperlukan. Metode include adalah cara utama untuk "memperluas" kelas dengan modul lain (biasanya disebut sebagai mix-in). Misalnya, jika kelas Anda mendefinisikan metode "masing-masing", Anda bisa memasukkan modul mixin Enumerable dan itu bisa bertindak sebagai koleksi. Ini bisa membingungkan karena kata kerja sertakan digunakan sangat berbeda dalam bahasa lain.

Sumber

Jadi, jika Anda hanya ingin menggunakan modul, daripada memperpanjang atau melakukan mix-in, maka Anda ingin menggunakannya require.

Anehnya, Ruby requireanalog dengan C include, sedangkan Ruby includehampir tidak seperti C include.


45
Sebenarnya C's include, tidak memuat file seperti yang diperlukan, tetapi ganti baris #include, dengan konten file. File yang disertakan tidak harus berupa 'header' dan #include tidak harus berada di awal file tetapi dapat di mana saja, seperti di kelas atau bahkan definisi metode. Ini berarti Anda dapat melakukan mixin dalam C ++ dengan menuliskan beberapa metode dalam file dan memasukkannya ke dalam kode kelas, persis seperti yang Anda lakukan di ruby. Jadi mereka tidak sejauh itu, meskipun itu memang bukan praktik umum di C's.
mb14

13
Jawaban ini bisa bermanfaat dengan memasukkan contoh.
Travis Bear

12
Komentar mb14 menyiratkan hal ini, tetapi ia menyatakan secara eksplisit: bertentangan dengan apa yang dikatakan jawabannya, mengharuskan tidak "menjalankan" file, tetapi memuatnya seolah-olah itu adalah bagian dari file yang mengandung. Ini mungkin tampak seperti pemalsuan semantik tetapi sebenarnya perbedaannya agak penting.
Lonny Eachus

Penjelasan yang bagus. Terima kasih telah mengarahkan poin ke rumah dengan pernyataan terakhir 'Anehnya, permintaan Ruby adalah analog dengan C's termasuk, sedangkan Ruby termasuk hampir tidak seperti C's termasuk.'
ArtSabintsev

1
@GregSchmit: includedi Ruby hanyalah warisan. class C; include M endmembuat Msuperclass Cdan (mantan) superclass dari Csuperclass M. Saya tidak berpikir bahwa C includebekerja melalui pewarisan, saya pikir itu substitusi teks / leksikal sederhana.
Jörg W Mittag

100

Jika Anda menggunakan modul, itu berarti Anda membawa semua metode ke kelas Anda. Jika Anda extendkelas dengan modul, itu berarti Anda "memasukkan" metode modul sebagai metode kelas . Jika Anda includekelas dengan modul, itu berarti Anda "memasukkan" metode modul sebagai metode instan .

EX:

 module A
   def say
     puts "this is module A"
   end
 end

 class B
   include A
 end

 class C
   extend A
 end

B.say => metode tidak jelas 'katakan' untuk B: Kelas

B.new.say => ini adalah modul A

C.say => ini adalah modul A

C.new.say => metode tidak jelas 'katakan' untuk C: Kelas


23
Saya pikir ini tidak menjawab pertanyaan, tapi itu yang saya cari =)
Ciro Santilli 郝海东 冠状 病 六四 六四 事件 法轮功

2
Ini sebenarnya tidak menjawab pertanyaan tentang apa perbedaan antara requiredan includeapa.

94

Dari buku Metaprogramming Ruby,

The require()Metode ini sangat mirip dengan load(), tapi itu dimaksudkan untuk tujuan yang berbeda. Anda gunakan load()untuk mengeksekusi kode, dan Anda gunakan require()untuk mengimpor perpustakaan.


73
Suara positif karena tidak membandingkan dengan bahasa lain dalam jawaban Anda :)
Stevo

Tidak memilih untuk tidak memberikan jawaban dalam konteks pertanyaan: "Jika saya hanya ingin menggunakan metode dari modul di kelas saya?"
benc

57
  • Ruby requirelebih mirip "sertakan" dalam bahasa lain (seperti C). Ini memberitahu Ruby bahwa Anda ingin membawa konten file lain . Mekanisme serupa dalam bahasa lain adalah:

  • Ruby includeadalah mekanisme pewarisan berorientasi objek yang digunakan untuk mixin .

Ada penjelasan yang bagus di sini :

[Jawaban] sederhana adalah bahwa membutuhkan dan memasukkan pada dasarnya tidak berhubungan.

"memerlukan" mirip dengan C termasuk, yang dapat menyebabkan kebingungan pemula. (Satu perbedaan penting adalah bahwa penduduk setempat di dalam file yang diperlukan "menguap" ketika kebutuhan dilakukan.)

Termasuk Ruby tidak seperti C termasuk. Pernyataan include "mencampur" modul ke dalam kelas. Ini bentuk terbatas dari pewarisan berganda . Modul yang disertakan secara harfiah menganugerahkan hubungan "is-a" pada hal termasuk itu.

Penekanan ditambahkan.


7

Pernahkah Anda mencoba requiremodul? Apa hasilnya? Coba saja:

MyModule = Module.new
require MyModule # see what happens

Modul tidak diperlukan, hanya termasuk!


Pernyataan di sini tidak benar. Modul dapat diminta. Dan siapa pun yang menjalankan kode di atas akan menemukan bahwa mereka menerima hasil yang sama ( TypeError) jika kata Moduletersebut diubah Class.
pjd

7

Dari Pemrograman Ruby 1.9

Kami akan membuat beberapa poin tentang pernyataan termasuk sebelum kita melanjutkan. Pertama, itu tidak ada hubungannya dengan file. Pemrogram C menggunakan arahan preprocessor yang disebut #include untuk memasukkan konten dari satu file ke yang lain selama kompilasi. Pernyataan termasuk Ruby hanya membuat referensi ke modul. Jika modul itu ada di file terpisah, Anda harus menggunakan keharusan (atau sepupunya yang kurang umum digunakan) untuk menyeret file itu sebelum menggunakan include. Kedua, Ruby termasuk tidak hanya menyalin metode instance modul ke dalam kelas. Sebagai gantinya, ia membuat referensi dari kelas ke modul yang disertakan. Jika beberapa kelas menyertakan modul itu, mereka semua akan menunjuk ke hal yang sama. Jika Anda mengubah definisi metode dalam modul, bahkan saat program Anda sedang berjalan,


3

Sertakan Ketika Anda Sertakan modul ke dalam kelas Anda seperti yang ditunjukkan di bawah ini, seolah-olah Anda mengambil kode yang ditentukan dalam modul dan memasukkannya ke dalam kelas, di mana Anda 'memasukkannya'. Ini memungkinkan perilaku 'mixin'. Ini digunakan untuk MENINGGALKAN kode Anda untuk menghindari duplikasi, misalnya, jika ada beberapa kelas yang akan membutuhkan kode yang sama dalam modul.

Memuat Metode memuat hampir seperti metode yang disyaratkan kecuali tidak melacak apakah perpustakaan telah dimuat atau tidak. Jadi mungkin untuk memuat pustaka beberapa kali dan juga saat menggunakan metode pemuatan, Anda harus menentukan ekstensi “.rb” dari nama file pustaka.

Wajib Metode mengharuskan memungkinkan Anda memuat pustaka dan mencegahnya dimuat lebih dari sekali. Metode yang disyaratkan akan mengembalikan 'false' jika Anda mencoba memuat pustaka yang sama setelah pertama kali. Metode yang diperlukan hanya perlu digunakan jika pustaka yang Anda muat didefinisikan dalam file terpisah, yang biasanya merupakan kasus.

Anda dapat memilih ini http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/


3

Berikut adalah beberapa perbedaan mendasar antara keharusan dan termasuk:

Memerlukan:

  1. Perlu membaca file dari sistem file, mem-parsingnya, menyimpannya ke memori dan menjalankannya di tempat tertentu yang berarti jika Anda bahkan akan mengubah apa pun saat skrip berjalan, perubahan itu tidak akan mencerminkan perubahan itu.
  2. Kami membutuhkan file dengan nama, bukan dengan nama modul.
  3. Biasanya digunakan untuk pustaka dan ekstensi.

Termasuk:

  1. Ketika Anda memasukkan modul ke dalam kelas Anda itu berperilaku seolah-olah Anda mengambil kode yang didefinisikan dalam modul Anda dan memasukkannya ke dalam kelas Anda.
  2. Kami menyertakan nama modul, bukan nama file.
  3. Biasanya digunakan untuk mengeringkan kode dan untuk menghapus duplikasi dalam kode.

2
require(name)

Ini akan mengembalikan bolean benar / salah

Nama yang dilewatkan sebagai parameter ke keharusan, ruby ​​akan mencoba menemukan file sumber dengan nama itu di jalur muat Anda. Metode yang disyaratkan akan mengembalikan 'false' jika Anda mencoba memuat pustaka yang sama setelah pertama kali. Metode yang diperlukan hanya perlu digunakan jika pustaka yang Anda muat didefinisikan dalam file terpisah. Jadi itu melacak apakah perpustakaan itu sudah dimuat atau tidak.

include module_name

Misalkan jika Anda memiliki beberapa metode yang perlu Anda miliki dalam dua kelas yang berbeda. Maka Anda tidak harus menulisnya di kedua kelas. Alih-alih apa yang dapat Anda lakukan adalah, tentukan dalam modul. Dan kemudian termasuk modul ini di kelas lain. Ini disediakan oleh Ruby hanya untuk memastikan prinsip KERING. Ini digunakan untuk KERING kode Anda untuk menghindari duplikasi


2

Termasuk

Ketika Anda includesebuah modul ke dalam kelas Anda, seolah-olah Anda mengambil kode yang ditentukan dalam modul dan memasukkannya ke dalam kelas, di mana Anda 'memasukkannya'. Ini memungkinkan perilaku 'mixin'. Ini digunakan untuk MENINGGALKAN kode Anda untuk menghindari duplikasi, misalnya, jika ada beberapa kelas yang akan membutuhkan kode yang sama dalam modul.

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  include Log 
  # ... 
end

tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error

Memerlukan

Metode yang diperlukan memungkinkan Anda untuk memuat perpustakaan dan mencegahnya dimuat lebih dari sekali. Metode yang disyaratkan akan mengembalikan 'false' jika Anda mencoba memuat pustaka yang sama setelah pertama kali. Metode yang diperlukan hanya perlu digunakan jika pustaka yang Anda muat didefinisikan dalam file terpisah, yang biasanya merupakan kasus.

Jadi itu melacak apakah perpustakaan itu sudah dimuat atau tidak. Anda juga tidak perlu menentukan ekstensi ".rb" dari nama file perpustakaan. Berikut adalah contoh cara menggunakan yang diperlukan. Tempatkan metode yang diperlukan di bagian paling atas file ".rb" Anda:

Beban

Metode pemuatan hampir seperti metode yang disyaratkan kecuali tidak melacak apakah pustaka telah dimuat atau tidak. Jadi mungkin untuk memuat pustaka beberapa kali dan juga saat menggunakan metode pemuatan, Anda harus menentukan ekstensi “.rb” dari nama file pustaka.

Memperpanjang

Saat menggunakan metode extended alih-alih menyertakan, Anda menambahkan metode modul sebagai metode kelas alih-alih sebagai metode instan.

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type

2

'Load'- menyisipkan konten file. (Parse file setiap kali file dipanggil)

'Membutuhkan'- memasukkan konten yang diurai file. (File diurai sekali dan disimpan dalam memori)

'Sertakan' - termasuk modul ke dalam kelas dan dapat menggunakan metode di dalam modul sebagai metode instance kelas

'Perluas' - termasuk modul ke dalam kelas dan dapat menggunakan metode di dalam modul sebagai metode kelas

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.