web-dev-qa-db-ja.com

Luaではどのようにモジュールをインポートしますか?

使いますか

require "name"

または

local name = require "name"

また、システムモジュールをローカル変数として明示的に宣言していますか?例えば。

local io = require "io"

あなたの選択を説明してください。

Lua 2edでのプログラミングでは、「モジュールに短い名前を使用したい場合は、ローカル名を設定できます」とあり、local m = require "mod"require "mod"より高速であることについては何も述べていません。違いがない場合は、クリーナーrequire "mod"宣言を使用し、プリロードされたシステムモジュールの宣言を記述しません。

15
Vitaly

どちらでも機能します。ローカルに保存しても、モジュールがグローバル関数を登録している可能性があるという事実は変わりません。

6
Nicol Bolas

一部のライブラリは一方向のみで機能し、一部は他の方法でのみ機能します

require "name"構文は、lua 5.1で導入されたものです。メモとして;この呼び出しは常にモジュールを返すわけではありません。しかし、ライブラリの名前でグローバルが作成されることが予想されていました(したがって、ライブラリを使用するための_G.nameが用意されています)。たとえば、以前のバージョンのgsl-local draw = require"draw"を実行した場合、ローカルdrawにはtrueが含まれます。ライブラリによって作成されたグローバルdrawをシャドウイングします。

上記の動作はmodule関数==>によって推奨されます。現在は比較的非推奨であり、適切に記述された新しいコードでは使用されません。

local name = require"name"構文は最近(2008年頃?)モジュールがあなたのためにグローバルを設定することが悪いことであると決定されたとき。要点として、私のライブラリはすべてグローバルを設定せず、関数のテーブルを返すだけです。または、他のいくつかのケースでは、ルートオブジェクトの初期化子として機能する関数を返します。

tldr;新しいコードでは、後者のlocal name = require"name"構文を使用する必要があります。ほとんどの場合で機能しますが、古いモジュールを使用している場合は、それらがサポートしていない可能性があるため、require"module"を使用する必要があります。


追加した質問に答えるには: システムモジュールが必要ですか?:いいえ。あなたはそれらがすでに必要であると仮定するだけです。しかし、外部ライブラリの関数を含め、使用するすべての関数(通常は元のモジュールによって行にグループ化されています)をローカライズします。これにより、コードが実際に依存している関数を簡単に確認できます。また、バイトコードからすべてのGETGLOBALを削除します。

編集:ローカライズ機能は現在推奨されていません。偶発的なグローバルを見つけるには、リンターを使用します luacheck

(my)好ましいスタイルのサンプルモジュール; local name = require"name"構文でのみ機能します。

local my_lib = require"my_lib"

local function foo()
    print("foo")
end

local function bar()
    print("bar", my_lib.new())
end

return {
    foo = foo;
    bar = bar;
}
7
daurnimator

それは主にあなたが好むものに要約されると私は言うでしょうが、あなたが書いているものに応じていくつかの例外があります。ローカル参照を作成すると速度が向上しますが、ほとんどの場合、これは意味のある最適化ではありません。また、モジュールテーブルではなく、使用している関数をローカルにポイントする必要があります。

ライブラリを作成している場合は、使用するすべてのグローバル変数のローカル参照を作成することをお勧めします。 module()関数を使用していない場合でも、次のコードのグローバルスコープが変更されます。これは、ライブラリが読み込まれた後に変更されたグローバルをライブラリが呼び出せなくなるためです。

local io = require’io’を実行すると、_G.ioが別のテーブルに置き換えられた場合でも、package.loaded.ioから確実にテーブルを取得できます。私は通常、自分でこれを行うことはありません。 Luaを作成するとき、ioはすでにロードされており、変更されていないものと想定しています。

Luaモジュールを作成するにはいくつかの方法があることも覚えておく必要があります。モジュールによってはモジュールテーブルを返さないものもあれば、グローバル変数を作成しないものもあります。最も一般的な解決策は、グローバルを作成して返すことですが、常にこれに依存することはできません。

1
Trond A Ekseth