2013-05-20 56 views
1

1是否有一種方法可以編寫函數以僅基於它們具有相同密鑰的事實來乘以兩個值?下面是一些psudocode什麼,我心裏有:在Lua中有一個共同密鑰的調用值

operation = {a=12, b=7, c=31} 
operator1 = {a=0.5} 
operator2 = {a=0.7} 
operator3 = {b=0.3} 

function Operate(x) 
    return x.common_key * operation.common_key 
end 

print (Operate (operator1)) 
print (Operate (operator3)) 

---> 6 
---> 2.1 

當然此代碼不起作用,因爲「common_key」不是一個真實的東西。無論函數的論點與「操作」字典有什麼共同之處,它都是一種替身。在這種情況下,它將是「a」,所以如果可能的話,該函數將乘以「operator1.a」和「operation.a」。

+1

'function Operate(x)local k,v = next(x)return operation [k] * v end' –

+0

這很好用!我只是不知道如何。我將閱讀手冊中的「下一個」功能...... – ridthyself

回答

2

您可以使用pairs函數遍歷表,從而檢查它可用的鍵。此外,如果k是「名稱」字符串,並且lua表返回nil,如果您訪問它沒有的鍵,則可以使用t [k]符號而不是t.name訪問表。

function find_common_keys(t1, t2) 
    for k,v1 in pairs(t1) do 
     local v2 = t2[k] 
     if v2 ~= nil then 
      print("Found match", k, v1, v2) 
     end 
    end 
end 
+0

因爲操作員只會有一個值,所以如果它只運行一次,我就無法證明循環。那麼像return x [1] * operation [x [1]]這樣的東西呢? – ridthyself

+1

@etothepowerofx:ipairs在內部使用'next'來迭代表格。如果你知道你的表只有一個鍵,你可以使用它。除此之外,使用next/ipairs是查看錶中的哪些鍵是唯一的方法。就個人而言,我會將輸入格式更改爲更容易處理的內容(比如,'operator1 = {key =「a」,value = 0.5}'),或者我會運行一次循環並在某處緩存結果。 – hugomg

+0

閱讀後面的手冊部分,並在第27次配對時最終點擊您的建議。謝謝! – ridthyself

相關問題