代码之家  ›  专栏  ›  技术社区  ›  Eduardo León

你能把一个“扩展”数组传递给C语言中的函数吗,就像Ruby语言中的函数一样?

  •  5
  • Eduardo León  · 技术社区  · 15 年前

    在Ruby中,您可以这样做:

    def method(a, b) ... end
    myMethod(*myArray)
    

    因此,如果myarray有2个项目,它将相当于:

    myMehtod(myArray[0], myArray[1])
    

    因此,在方法体中,a==myarray[0]和b==myarray[1]

    你能用C语言做这个吗?(因此,我可以用显式参数声明一个方法,而不只是将数组作为参数)

    编辑:我应该对正在调用的方法更具体一些。

    5 回复  |  直到 8 年前
        1
  •  9
  •   Konrad Rudolph    15 年前

    您的方法可以声明为接受参数数组,通过 params :

    void F(params int[] foo) {
        // Do something with foo.
    }
    

    现在您可以传递任意数量的 int s到方法,或 int . 但是给定一个固定的方法声明, 不能 在Ruby中尽可能快速地扩展数组,因为参数在引擎盖下的处理方式不同(我相信Ruby中的处理方式不同),而且C_诳没有那么动态。

    理论上,您可以使用反射来调用该方法以实现相同的效果(反射方法调用始终接受参数数组)。

        2
  •  7
  •   Mark Rushakoff    15 年前

    如果用 params 关键字,可以传入数组 任意数量的单个参数。

    例如:

    public class Foo
    {
        public static void Main()
        {
            int[] x = new int[] {1,2,3};
            Bar(x);
            Bar(10,11,12);
        }
    
        public static void Bar(params int[] quux)
        {
            foreach(int i in quux)
            {
                System.Console.WriteLine(i);
            }
        }
    }
    

    生产

    1
    2
    3
    10
    11
    12
    
        3
  •  1
  •   Lucas    15 年前

    不,当数组作为参数传递给C方法时,不能让它“自动展开”。一种模拟方法是编写方法重载:

    MyMethod(int a, int b) { /* ... */ }
    
    MyMethod(int[] c)
    {
       // check array length?
       MyMethod(c[0], c[1]);
    }
    
    AnotherMethod()
    {
       int[] someArray = new[] {1,2};
    
       MyMethod(someArray); // valid
       MyMethod(1,2);       // valid
    }
    

    但正如其他一些人已经提到的,使用 params 关键字。在我的例子中(还有你的例子),你总是以分开 a b . 用 帕拉姆 你总是有一个数组需要处理。

        4
  •  0
  •   EricSchaefer    15 年前

    你可以这样做:

    void MyMethod(params MyType[] args)
    {
    }
    
    
    MyMethod(myObject1, myObject2, myObject3);
    
    MyType[] a = { new MyType(),  new MyType() };
    MyMethod(a);
    
        5
  •  0
  •   Nick Sotiros    8 年前

    我有一个 PostServer(string path, params object[] objects) 方法将JSON发布到我的服务器。但在发送对象数组之前,我在它前面预先准备了一个会话令牌。

    string access_token = "<access_token>";
    string url = "http://example.com";
    
    void PostJson(string path, params object[] objects) {
        SendHttp(url + path, HttpMethod.POST, JSON.Stringify(objects));
    }
    
    void PostServer(string path, params object[] objects) {
        object[] moreObjects = new object[objects.Length + 1];
        object[0] = access_token;
        objects.CopyTo(moreObjects, 1);
        PostJson(path, moreObjects); // moreObjects will be expanded into PostJson objects
    }
    

    然后… PostServer("/greet", "Hello World!", true, 3.1415);

    将发送JSON ["<access token>","Hello World!",true,3.1415] 在我的服务器上。

    实际上在实践中我把 moreObjects 右入 JSON.Stringify 但你明白了。

    所以您可以展开数组,但是您已经传递了一个数组作为唯一的参数。在咖啡里你可以 PostJson(path, access_token, objects...) ,因为它有一个splat运算符 ... .

    如果你尝试过 PostJson(path, access_token, objects) 在C中,您将发送JSON ["<access_token>",["Hello World!",true,3.1415]]