當前位置:首頁 » 編程軟體 » lua腳本參數

lua腳本參數

發布時間: 2023-05-14 10:31:07

❶ 如何在java中使用Lua腳本語言

LuaJava實際上就是按照Lua官方文檔, 把Lua的C介面通過JNI包裝成Java的庫. 下載, 裡面是一個.dll, 一個.jar. 把.dll放到java.library.path下, 再把.lib放到classpath中, helloworld運行OK.
但是, 測試的時候, 很快發現了第一個問題: 在調用LuaJava中提供的LuaState.pushInteger方法的時候, 出現了錯誤 :Unsatisfied Link Error. 其他的LuaState.pushNumber方法倒是沒有問題. 用Depends工具看了下, 這個.dll居然沒有導出pushInteger這個函數。

(1).下載LuaJava的源代碼, 查看了下Luajava.c 和 Luajava.h, 發現果然裡面有點問題, 在.h裡面定義了JNI中對應Java函數的C函數
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
但是.c中沒有實現這個函數. 無語, 看來大馬虎哪都有啊. 幸虧有源代碼, 照貓畫虎在Luajava.c中加上這個函數的實現,

(2).然後編譯. 編譯也出現了問題了, 官方文檔中說可以用VC++來Build, 但是沒有說官方用的是什麼版本. 我用VC2005就不行. 好在Luajava比較小, 就一個.h 一個 .c , 在VC中新建一個.dll項目, 把文件加進去, 修改一下build參數 (Include 需要加上lua的頭文件, lib中需要加上lua的.lib文件, 另外要選上Compile as C Code (/TC)) Build, 通過了.
這時再在Java中調用pushInteger方法就沒有問題了.
在測試中, 發現Luajava提供的文檔中, 對於Lua腳本怎麼調用Java對象/方法很詳細, 但是在Java中怎麼調用Lua函數/取得返回值 就沒有. 參考了http://www.lua.org/manual/5.1/manual.html#lua_CFunction的Lua C文檔, 實現了傳遞對象到Lua中並取得返回值的代碼:
Test1: 測試傳遞簡單類型, 並取得返回值:
Lua 腳本(test.lua):

function test(a,b)
return a+b
end
Java代碼:
static {
//載入Lua5.1.dll, 因為LuaJava最後還是要調用Lua的東西
System.loadLibrary("lua5.1");
}
public static void main(String[] argu) throws LuaException {
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
//讀入Lua腳本
int error = L.LdoFile("test.lua");
if (error != 0) {
System.out.println("Read/Parse lua file error. Exit.");
return;
}
//找到函數test
L.getField(LuaState.LUA_GLOBALSINDEX, "test");
//參數1壓棧
L.pushInteger(1);
//參數2壓棧
L.pushInteger(2);
//調用!! 一共兩個參數, 1個返回值
L.call(2, 1);
//保存返回值, 到a中
L.setField(LuaState.LUA_GLOBALSINDEX, "a");
//讀入a
LuaObject l = L.getLuaObject("a");
//列印結果.
System.out.println("Result is " + l.getString());
L.close();
}

測試2: 傳遞Java對象
class Value {
public int i;
public void inc() {
i++;
}
public int get() {
return i;
}
public String toString() {
return "Value is " + i;
}
}
Lua腳本: (該腳本中調用兩次對象的inc方法, 並調用get方法輸出結果)
function test1(v)
v:inc();
v:inc();
print("In lua: " .. v:get());
return v
end
Java 代碼: (前面都一樣, 略)
//找到函數est1
L.getField(LuaState.LUA_GLOBALSINDEX, "test1");
//生成新的對象供測試
Value v = new Value();
//對象壓棧
L.pushObjectValue(v);
//調用函數test1, 此時1個參數, 1個返回值
L.call(1, 1);
//結果放在b中.
L.setField(LuaState.LUA_GLOBALSINDEX, "b");
LuaObject l = L.getLuaObject("b");
System.out.println("Result is " + l.getObject());

總結:運行結果:
Result is Value is 2
In lua: 2
和預期的一致.

❷ 怎麼使用lua腳本

LUA腳本語言基本使用方法是本文要將介紹的內容,主要是來學習Lua腳本語言的使用方法,具體內容來看本文詳解。
先要把下邊這些語句加入到VC中的頭文件,一般是加到StdAfx.h中
extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" #pragma comment(lib, "lualib.lib") #pragma comment(lib, "lua.lib") }

然後一般來說都使用一個全局的LUA庫定義的這個東西
lua_State* g_Lua;

並且在工程處初始化時也給LUA初始化
g_Lua = lua_open(); **加這句 /* load Lua base libraries */ 網上一些教材中這么寫的 lua_baselibopen(g_Lua); 不過我這簡單的例子中不用到這些也行 lua_tablibopen(g_Lua); lua_iolibopen(g_Lua); lua_strlibopen(g_Lua); lua_mathlibopen(g_Lua);

緊接著聲明介面函數,注冊上函數
lua_register(g_Lua, "Message", myMessage);

好,初始化部分完了,看看介面函數的寫法。
函數必須這樣的格式來寫
static int Func(lua_State *L) { 靜態型函數,而且必須帶參數為lua_State結構指針 返回的值是代表返回的數據個數,比如return 2;就可以代表 返回兩個整數啊,浮點數什麼的,象LUA的腳本編寫就可以這樣 i, j = Func() , 這樣就表示可以從Func介面函數中得到兩個返回值了 return 0; }

執行腳本語句可以讀文件,也可以直接讀函數名
注冊了
lua_register(g_Lua, "Message", myMessage); static int myMessage(lua_State *L) { OutputDebugString("OK"); return 0; } lua_dofile(g_Lua, strCurPath); //讀文件,必須給出完整的文件路徑名稱 lua_dostring(g_Lua, "Message()"); //直接讀函數

文件中只要寫上
Message()

就可以了。

❸ C#中執行Lua腳本

 一:

new lua().DoFile("myLua.lua");              //執行lua腳本      /myLua.lua:要         執行的lua的腳本名字

new lua().DoString("num = 2");             //讀取腳本

注意:腳本文件必須和工程目銷喚錄所在是同一塵斗旦個路徑不然會找不到lua的          腳本

對lua腳本的位置放置:

      1)直接將lua文件,放在工程目錄下面的Debug文件夾

       2)將lua腳本的屬性中 "復制到輸出目錄" 選擇「始終復制」

--1.導入luanet程序集,該程序集負責 lua call C#

require 「luanet」

--2.載入程序集(命名空間)

uanet.load_assembly(「System」)         // 載入程序集(我們說過程序集其實就是.exe或者.dll文件)

--3.獲取類別(獲取類名)

Test = luanet.import_type(「System.Test」)      //引入類(Test就是類名)

--4.調用構造函數初始化C#腳本的類對象

--調用無參數的構造函數

-- test = Test()

--調用有參數的構造函數 ----int

-- test = Test(10)

--調用有參數的構造函數 ----string

-- test = Test("10")

-- lua調用C#構造函數規則---> 自動匹配最近的那個

-- -對於某些情況並不適用,比如說C#函數中有兩個一個參數的構造函數重載時即會發生匹配錯誤的情況

--- 這種情況我們需要手動指定調用哪個構造函數

test_argInt = luanet.get_constructor_bysig(Test,"System.String")

t = test_argInt(3)

-- 5.調用C#屬性

print(t.LanguageNume)

-- 調用Test類中的TestPrint()方法,使用的是":"

t:TestPrint(10);

-- 調用Test類中的靜態方法,使用的是"."

Test.TestStatciPrint(9)

--調用帶有ref參數的方法

t:RefMethod(8)

--調用帶有out參數的方法(帶有out的參數可派擾以不寫,即不傳參數)

--  var,var2 = t:OutMethod("hello")

-- print(var2)

-- v1,v2,v3,v4 = t:OutMethod(10)

tb = t:OutMethod(10)

print(type(tb))

❹ Redis 中使用 Lua 腳本

Redis 本身已經提供了豐富的命令,但是直接用來處理一些復雜業務時可能還不夠方便,會有一定的局限性。因此,在 Redis2.6 版本開始提供了對 Lua 腳本的支持,Lua 腳本的使用還是比較廣泛的,比如商品秒殺、分布式鎖等,使用 Lua 腳本可以帶來以下的好處:

為了讓例子更加的貼近實際應用,這里實現一個簡單版的分布式鎖。這里先用 Jedis 操作。

上邊詳細的介紹了分布式鎖的實現過程,以及可能出現的問題,最終,我們決定刪除鎖的操作使用 Lua 腳本實現,對應的腳本如下:

Lua 腳本中執行具體的 Redis 命令,需要使用 redis.call() 方法, KEYS 表示客戶端發起腳本執行命令時攜帶的 Redis key 的一個集合, ARGV 則是其它參數的一個集合,主意下標從1開始。結合我們的業務,這里的 KEYS[1] 則表示 lock , ARGV[1] 則是一個隨機字元串。整個腳本的含義就是,如果客戶端傳遞的 lock 的 value 和 Redis 中存儲的一致,就刪除 lock 。

Lua 腳本的語法還是比較簡單的,具體內容可以自行學習。

前邊的准備工作基本結束了,文章開始說過執行腳本有兩種途徑,下邊我們具體來看:

這里使用 jedis.eval() 發送腳本到 Redis 伺服器執行,後兩個參數分別是 key 的集合,以及 value 參數的集合。

先將腳本以文件形式放到 Redis 里,例如這樣:

然後通過如下命令讓 Redis 伺服器緩存腳本:

script load 命令會在 Redis 伺服器緩存 Lua 腳本,並且腳本內容經過 SHA-1 簽名演算法處理後,會返回腳本內容的 SHA1 校驗和的編碼,然後在端調用時,傳入編碼字元串作為參數,這樣 Redis 伺服器就會執行對應緩存的腳本了,就不用了每次發送具體的腳本內容了。

還有兩個比較有用的命令:

除了使用上邊的命令緩存腳本、生成腳本的 SHA1 校驗和的編碼,還可以使用 Jedis 實現,但最終的 SHA1 編碼內容是不同的:

實際的項目中,可能更多的會在 SpringBoot 項目中整合 Redis,此時執行 Lua 腳本的基本流程如下:

核心的類就是 DefaultRedisScript ,它實現了 RedisScript 介面。 execute() 方法最後一個參數是可變類型的,用來傳遞多個 value 參數。初次執行 execute() 方法時,其內部會自動緩存 Lua 腳本到 Redis 伺服器;同時每次執行腳本時會根據腳本內容自動計算出對應的 SHA1 校驗和的編碼,去匹配、執行緩存的腳本。

具體的 SHA1 校驗和的編碼,可以在 execute() 方法執行後,使用 redisScript.getSha1() 查看。使用 SpringBoot 方式 執行 Lua 腳本生成的 SHA1 校驗和的編碼和前邊直接使用 Jedis 生成的一致。

無論用那種方式在 Redis 中使用 Lua 腳本,其中的原理都是類似的。

❺ lua 腳本怎麼傳遞參數

只能調用了,多加一個參數,
for i=1,5 do
nRet_rw = math.random(6)
x002103_OnEventRequest( sceneId, selfId, targetId, eventId,nRet_rw )
end

或者把nRet_rw作為全局變數。

❻ LUA腳本怎麼合函數傳遞參數

static int ABC(lua_State *L)
{
int n =lua_gettop(L);
double sum =0;
int i;
for (i=1;i<胡悶圓租n;i++)
{
sum+=lua_tonumber(L,i);
}
lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
return 2;
} lua_register(L, "褲腔彎ABC", ABC);

❼ 怎樣給lua腳本傳遞參數和腳本怎樣接受這些參數

兩種方式:
1、腳本內定義全局函數(非local的), 然後在別的腳本require這個腳本後直接通過名稱和參數進行調用(類似c函數的調用)

2、腳本內定義一個message_handler的入口函數(類似main函數),這個入口函數接受一個msg和一系列的params。然後碼此別的腳本或函數通過postmessage或者sendmessage函數。向指定腳敬者本遲稿迅傳遞參數msg和params,進而進行處理

❽ redis 執行 xxx.luaxxx.lua 腳本如何傳參數。格式是什麼

在Redis中執行Lua腳本有兩種方法:eval和evalsha
1.eval
eval 腳本內容 key個數 key列表 參數列表
如果Lua腳本較長,還可以使用redis-cli-eval直接執行文件。
客戶端如果想執行Lua腳本,首先在客戶端編寫好Lua腳本代碼,然後把腳本作為字元串發送給服務端,服務端會將執行結果返回給客戶端。
2.evalsha
將Lua腳本載入到Redis服務端,得到該腳本的sha1校驗和,evalsha命令使用sha1作為參數可以直接執行對應的Lua腳本,避免每次發送Lua腳本的開銷。這樣客戶端就不需要每次執行腳本內容,而腳本也會常駐在服務端,腳本內容得到了復用。
載入腳本: script load命令可以將腳本內容載入到Redis內存中。
lua的Redis API
lua可以使用redis.call函數實現對Redis的訪問
redis.call(「set」,」hello」,」world」)
redis.call(「get」,」hello」)
除此之外Lua還可以使用redis.pcall函數實現對Redis的調用,redis.call和redis.pcall的不同在於,如果redis.call執行失敗,那麼腳本執行結束會直接返回錯誤,而redis.pcall會忽略錯誤繼續執行腳本。
Lua腳本功能為Redis開發和運維人員帶來的如下三個好處:
1.Lua腳本在Redis中是原子執行的,執行過程中間不會插入其他命令。
2.Lua腳本可以幫助開發和運維人員創造出自己定製的命令,並可以將這些命令常駐在Redis內存中,實現復用的效果。
3.Lua腳本可以將多條命令一次性打包,有效地減少網路開銷。
Redis如何管理Lua腳本
1.script load
此命令用於將Lua腳本載入到Redis內存中
2.script exists
scripts exists sha1 [sha1 …]
此命令用於判斷sha1是否已經載入到Redis內存中
3.script flush
此命令用於清除Redis內存已經載入的所有Lua腳本,在執行script flush後,sha1不復存在。
4.script kill

❾ lua腳本中,要得到函數的可變參數,將它賦值到別的變數

把你的激仔具體代碼貼出明仔汪來 (包括調用戚老 fun 的代碼),按理你那麼用是沒問題的 (如果 args 確實是一個含有 from 鍵值的table)。

熱點內容
紅點角標演算法 發布:2025-07-12 12:11:16 瀏覽:843
開心消消樂伺服器繁忙什麼情況 發布:2025-07-12 12:11:14 瀏覽:237
資料庫的封鎖協議 發布:2025-07-12 12:10:35 瀏覽:724
如何配置一台長久耐用的電腦 發布:2025-07-12 11:43:03 瀏覽:601
昆明桃源碼頭 發布:2025-07-12 11:38:45 瀏覽:568
大司馬腳本掛機 發布:2025-07-12 11:38:35 瀏覽:458
資料庫實時監控 發布:2025-07-12 11:31:33 瀏覽:743
vb6反編譯精靈 發布:2025-07-12 11:23:12 瀏覽:997
模擬存儲示波器 發布:2025-07-12 11:10:58 瀏覽:814
怎麼查看安卓真實運行內存 發布:2025-07-12 11:08:39 瀏覽:883