1

ルア 5.1.4

例えば:

bar = {}
bar.name = 'test'
bar['123.com'] = function(self) print(self.name) end

以下のようなメソッドを呼び出すことはできません。

bar:['123.com']()
stdin:1: '<name>' expected near '['

以下は動作しますが:

bar['123.com'](bar)

しかし、私はこれがどういうわけか醜いです。この状況に構文糖衣はありますか?

または、本当にそれができない場合、Lua チームは将来この構文を追加しますか?

それとも彼らはこれを意図的にやったのですか?

4

6 に答える 6

7

いいえ、あなたが望むようにメソッドを呼び出すことはできません。次の構文のみでメソッドを呼び出すとします。

bar['123.com'](bar)
于 2012-04-18T04:17:50.767 に答える
4

数字で始まらないエイリアスを作成し、それを使用してください。

bar.name123 = bar['123name']

bar:name123()
于 2012-04-19T08:13:02.857 に答える
2

以下のようなことを考えてみてください ( http://www.lua.org/cgi-bin/demoでオンラインでテストできます):

bar = {}
bar.name = 'test'
bar['123.com'] = function(self) print(self.name) end

bar2 = setmetatable({}, {
  __index = function(t, key)
    return function(...)
      return bar[key](bar, ...)
    end
  end
})

bar2['123.com']()
-- output: test

同様の方法で動作するようにそれ自体を変更することもできbarますが、値を割り当てる前にそれを行う必要があります-例:

bar = {}

local privatekey = {}
setmetatable(bar, {
  __index = function(t, key)
    local value = rawget(t, privatekey)[key]
    if type(value) ~= 'function' then
      return value
    end
    return function(...)
      return value(t, ...)
    end
  end,
  __newindex = function(t, key, value)
    rawset(t, privatekey, rawget(t, privatekey) or {})
    rawget(t, privatekey)[key] = value
  end
})

bar.name = 'test'
bar['123.com'] = function(self) print(self.name) end
bar['123.com']()
-- output: test
于 2012-04-19T14:30:09.357 に答える
2

Lua メンテナーが将来のバージョンで何を追加するかは誰にもわかりません (彼らはかなり口を閉ざしています) が、私の推測では、少なくとも尋ねられずに追加する可能性は低いと思います — そして私はそのような要求を見たことがありませんLuaメーリングリストにあるもの...

しかし、私の直感では、この機能はわかりにくいように思えます。そのような「変な」名前のメソッドを実際に呼び出したいと思う人はどれくらいいるでしょうか? それを考えると、「回避策」は実際にはまったく悪くないので、そのような機能をサポートするために実装に複雑さを追加する価値があるかどうかは不明です (完全に自明でない限り)。

質問してみたい場合は、Lua メーリング リストに投稿してください。Lua メーリング リストでは、ほとんどの議論が行われています。 lua-l@lists.lua.org

于 2012-04-18T23:59:32.897 に答える
1

なんてこった...

bar = {
    ['123.com'] = function(self)
        print("YAY!", self)
    end
}
function f()
    print(bar)
    bar:WHATTHE()
end

function crazy(f, patt, repl)
    local f_str = string.dump(f)
    local newf_str = string.gsub(f_str, "WHATTHE", "123.com")
    assert(#newf_str == #f_str, "replacement must be of same length")
    local newf = loadstring(newf_str)
    setfenv(newf, getfenv(f))
    return newf
end

f = crazy(f, "WHATTHE", "123.com")

f()
--[[ Output:
    table: 005EB688
    YAY!    table: 005EB688
]]

これをしないでください-これまで

于 2012-04-18T09:50:24.777 に答える
1

クロージャーを使用できます:

bar = {}
bar.name = 'test'
bar['123.com'] = function() print(bar.name) end
bar['123.com']()

function bar:addBar(name)
    bar[name] = function() print(self.name) end
end

bar:addBar('456.com')

bar['456.com']()
于 2012-04-18T04:21:27.697 に答える