6

ここに私が直面している問題があります:

次の行で Wax に NSDecimalNumber を作成します

    local x=NSDecimalNumber:initWithString("2.3") 

これから、次の行で NSDecimal を作成したいと思います

   local y=x:decimalValue() 

これにより、プログラムが即座にクラッシュします。

同じエクスペリエンスを作成するには、基本的なワックス プロジェクトを作成し、AppDelegate.luaの関数 applicationDidFinishLaunchingの lat 行として 2 行を追加する必要があります。

質問: 渡すことができる正直な NSDecimal を返すにはどうすればよいですか? 実際に自分で番号を表示または印刷する必要はありません。


付録

  1. インターネット上で広く信じられていることですが、NSDecimal は NSDecimalNumber とは大きく異なります。1 つ目は C 構造体で、2 つ目は Obj-C 構造体で、私は非常によく使用しています。
  2. NSDecimalNumber を機能させるには、wax-helpers.m の 222 ~ 224 行 (NSNumber) と 241 ~ 246 行 (NSValue) をコメントアウトする必要があります。
  3. NSDecimal は Foundation/NSNumber.h で定義されています

実行時の出力: スタック トレースはほとんどなく、静かに終了します。デバッガー (ブレークポイントがオンになっている) には、次の (省略された) 呼び出しシーケンスがあります。

#0  0x027553f4 in objc_exception_throw
#1  0x0256e8d6 in __NSGetSizeAndAlignment
#2  0x0256ebd9 in __NSGetSizeAndAlignment
#3  0x025747b8 in __NSMS1
#4  0x02573f9c in +[NSMethodSignature signatureWithObjCTypes:]
#5  0x000342d0 in wax_selectorForInstance at wax_helpers.m:557
#6  0x00035bc2 in __index at wax_instance.m:303
#7  0x000181b9 in luaD_precall at ldo.c:319
#8  0x00018405 in luaD_call at ldo.c:376
#9  0x0002c488 in callTMres at lvm.c:88
#10 0x0002c74a in luaV_gettable at lvm.c:125
#11 0x0002dd26 in luaV_execute at lvm.c:467
#12 0x0001841c in luaD_call at ldo.c:377
#13 0x0000ddc8 in f_call at lapi.c:800
#14 0x0001758a in luaD_rawrunprotected at ldo.c:116
#15 0x0001879a in luaD_pcall at ldo.c:463
#16 0x0000de65 in lua_pcall at lapi.c:821
#17 0x00034e60 in wax_pcall at wax_helpers.m:826  
#18 0x00036be4 in pcallUserdata at wax_instance.m:580
#19 0x00036edc in wax_id_call at wax_instance.m:627

時々、次の小さなスタック トレースがあります。

wTest[36403:207] PANIC: 

Error
-----
Error calling 'applicationDidFinishLaunching:' on lua object '<AppDelegate: 0x6300e50>'
data/scripts/AppDelegate.lua:39: attempt to index local 'x' (a number value)
stack traceback:
    [C]: ?
data/scripts/AppDelegate.lua:39: in function <data/scripts/AppDelegate.lua:19>

これは、デバッガーが提供するものと一致します: Wax は、数値のメソッドを呼び出そうとしています。

4

2 に答える 2

2

重要な編集: OK、私は愚かです (単純な質問に対する複雑な回答を探しています)。Wax ブログをざっと読んだところ、https://github.com/probablycorey/wax/wiki/Overviewがあり、関数について言及されていtoobjcます。そのため、次のように見えます...

local x = (toobjc)(NDecimalNumber:initWithString("2.3"));

あなたが望むことをします(つまり、Luaの自動型変換を防ぎます)。構文が少し間違っている可能性があるので、実験してください。別の「解決策」を説明するために、元の回答を以下に残しました。


したがって、Wax (私はあまり詳しくありません) に目を向けると、Objective C と Lua をブリッジするときに実行する重要な動作の 1 つは、可能なすべての Objective C 型を適切なネイティブ Lua 型に変換することです。これには、Lua の数値型にマップされるNSNumber型 ( など) が含まれます。NSDecimal

もちろん、あなたはすでにこれを知っているので、 に変更を加えますwax-helpers.m。残念ながら、あなたが行ったことは十分ではありません。コンバージョンはまだ発生しているため、NSDecimalNumberまだ数値になります。これが Lua コードで使用されるかどうかに応じて、Lua が失敗する (スカラー型のインデックスを作成しようとしている) か、Objective C ブリッジが失敗するようです。Lua トレース エラーがときどき発生する理由がわかりません(コードが常に同一であると仮定すると)。これは、Wax の内部状態が侵害されているという根本的な仮定を示しています。

最善の解決策は、ワックスの交換を伴わないものです。現時点では、「修正」が機能したとしても、タイプ間の自動強制を完全に無効にしています。これにより、かなりの数の Wax コードとイディオムが壊れることになると思います。Wax を見ると、明確に理解できる特定の Foundation クラスをサブクラス化する型の自動変換のみを実行します。認識されていないオブジェクト タイプは、オブジェクトのままです。NSValueこの場合、 andNSNumber変換に引っかかるので、最初の提案はNSDecimalNumber、Wax が理解できないクラスを単純にラップすることです。何かのようなもの...

@interface MyDecimalWrapper : NSObject
{
  NSDecimalValue *myDecimal;
}

- (NSDecimalValue*)getDecimalValue;
- (NSDecimal*)getDecimal;

@end

@implementation MyDecimalWrapper

- (NSDecimalValue*)getDecimalValue { return [[myDecimal retain] autorelease] }
- (NSDecimal*)getDecimal { return [myDecimal decimalValue]; }

@end

これは、コードを大幅に変更せずに Wax に追加できます。これを使用しNSDecimalValueてブリッジを渡って a を運ぶと、Wax の型変換を防ぐことができます。もちろん、getDecimalValueLua 内で使用すると、結果はすぐに Lua にラップされますnumber。Lua で基礎となるメソッドを呼び出す必要がある場合はNSDecimalValue、ラッパーで定義された同等のメソッドからそれらをプロキシするだけです。

これがどうしてもうまくいかない場合は、おそらく Wax に必要な変更を行うことができます。しかし、独自のポートを維持したり、既存の多くの Wax コードやサンプルを壊したりするのは大変なことです

NSDecimal接線的に: Lua で を取得した後、何をするつもりなのかわかりません。これは不透明な C 構造であり、Foundation が提供する C インターフェイスを介してのみ使用できます。

于 2011-06-24T19:54:38.900 に答える
0

たぶん、文字列NSScannerから作成しようとする必要がありNSDecimalます。

于 2011-06-24T09:19:12.360 に答える