5

次のように記述してオブジェクトを作成する代わりに:

obj: object [
    name: "Fork"
    id: 1020
]

みたいなことを書きたいのですが...

obj: something-or-another [name id] ["Fork" 1020]

...同じ結果が得られます。理想的なソリューションは、次のことも可能にします。

obj: something-or-another [name: id:] ["Fork" 1020]

を書くのは簡単something-or-anotherですが、これはすでに「ボックス内」にあるものに適合しますか?

4

3 に答える 3

2

少なくともRebol 3が必要なものは次のとおりです。

func [
    "Create an object based on some words and values."
    words [any-word! block!] "Word or block of words"
    values [any-type!] "Value or block of values"
    /local object
][
    object: make object! either block? words [length? words] [1]
    set bind/copy/new :words object :values
    object
]

設定されていない値の設定も許可したい場合は、これを試してください:

func [
    "Create an object based on some words and values."
    words [any-word! block!] "Word or block of words"
    values [any-type!] "Value or block of values"
    /any "Allows setting words to any value, including unset"
    /local object
][
    object: make object! either block? words [length? words] [1]
    apply :set [bind/copy/new :words object :values any]
    object
]

これらはどちらも を使用selfしてオブジェクトを作成するため、 を使用せずにオブジェクトを作成する場合selfは、より手の込んだトリックを行う必要があります。詳しくselflessプロポーザルをご覧ください。

于 2013-08-23T15:12:09.853 に答える
1

ほんの数日前に同様の関数 (Rebol2) を作成しました。

build-object: func [
    "Builds an object from a block"
    names [block!] "Field names"
    /values val [block!] "Initial values"
    /local o name value
] [
    o: copy []
    names: compose names
    o: either values [
        parse names [
            some [
                set name [word! | set-word!]
                (append o to-set-word name)
                | skip
            ]
        ]
        set/pad reflect o: context append o none 'words val
        o
    ] [
        if any [
            parse names [
                some [
                    set name [word! | set-word!]
                    (append o reduce [to-set-word name none])
                ]
            ]
            parse names [
                (clear o) some [
                    set name [word! | set-word!] set value any-type!
                    (append o reduce [to-set-word name :value])
                ]
            ]
        ] [context o]
    ]
    o
]

オブジェクトを作成するには、次のいずれかを記述できます: (create a function as f: does ["x"])

  • build-object [name "Fork" id 1020]
  • build-object [name: "Fork" id: 1020]
  • build-object/values [name id] ["Fork" 1020]
  • build-object/values [name: id:] ["Fork" 1020]
  • build-object [name f]
  • build-object [name (f)] ;block is composed
  • build-object [name 5 id f]
  • build-object [name 5 id 'f]

none値を省略した場合、フィールドが に設定されたオブジェクトを作成することもできます。

build-object [name id]
于 2013-08-21T07:35:47.787 に答える