用于元素引用和赋值的Ruby方法

时间:2018-02-04 01:26:15

标签: ruby-on-rails ruby methods code-documentation

我正在阅读Ruby 2.5.0的文档,我不了解这部分方法:

  

另外,元素引用和赋值的方法可以是   定义:[]和[] =分别。两者都可以采用一个或多个参数,   和元素引用可以不占用。

int parse_and_set(char *txt, const char *delim, char **var)
{
    if(delim == NULL || var == NULL)
        return 0;

    char *token = strtok(txt, delim);

    if(token == NULL)
        return 0;

    token = strdup(token);

    if(token == NULL)
        return NULL;

    *var = token;
    return 1;
}

void init_parse(char ***vars, size_t len)
{
    for(size_t i = 0; i < len; ++i)
        **(vars + i) = NULL;
}

int cleanup_parse(char ***vars, size_t len, int retval)
{
        for(size_t i = 0; i < len; ++i)
        {
            free(**(vars + i));
            **(vars + i) = NULL;
        }
}

int setupWifi(char **aiduser, char **aidkey, char **ssid, char **pass)
{
    if(aiduser == NULL || aidkey == NULL || ssid == NULL || pass == NULL)
        return 0;

    ...

    /* get the token token */

    char **vars[] = { aiduser, aidkey, ssid, pass };
    size_t len = sizeof vars / sizeof *vars;

    init_parse(vars, len);

    if(parse_and_set(char_array, s, aiduser) == 0)
        return cleanup_parse(vars, len, 0);

    if(parse_and_set(NULL, s, aidpass) == 0)
        return cleanup_parse(vars, len, 0);

    if(parse_and_set(NULL, s, ssid) == 0)
        return cleanup_parse(vars, len, 0);

    if(parse_and_set(NULL, s, pass) == 0)
        return cleanup_parse(vars, len, 0);



    ...

    return 1;
}

1)为什么以及如何在这种情况下赋值方法指定a = 2 b = 3和c = 4?

2)似乎它的行为类似于元素引用的方法,所以如果是这种情况,为什么它存在?我可以写:

class C
  def [](a, b)
    puts a + b
  end

  def []=(a, b, c)
    puts a * b + c
  end
end

obj = C.new

obj[2, 3]     # prints "5"
obj[2, 3] = 4 # prints "10"

并且它不会改变任何东西,不是吗?

1 个答案:

答案 0 :(得分:1)

  

1)为什么以及如何在这种情况下赋值方法指定a = 2 b = 3和c = 4?

abc参数234是争论。参数与其他方法一样被绑定到参数,因为[]= 就像其他方法一样一个方法。

  

2)似乎它的行为类似于元素引用的方法,所以如果是这种情况,为什么它存在?我可以写:[...]

您也可以写obj.foo(2, 3, 4)obj.frobnicate(2, 3, 4)obj.(2, 3, 4)。这没关系。它只是一种与其他方法一样的方法,而[]=只是一个与其他名称一样的名称。你也可以写它

obj.[]=(2, 3, 4)

如果你愿意的话。

这个名字并不重要。 (无论如何,到电脑。)

除了名称​​ 之外! (方法)名称是我们用来将代码的意图传达给我们(人类)同事的。

因此,[][]=是不同的名称,它们表达不同的意图。特别是,[]将意图传达给获取某些内容,[]=将意图传达给设置某事。但请注意,文档中的示例纯粹演示了如何为索引器和索引赋值方法绑定参数,它们如何使用此类方法的良好示例;也许这是你困惑的一部分原因。一个更好的示例是[][]=类如何使用ArrayHash方法。

另请注意&#34;名称并不重要&#34;有点夸张。名称​​确实很重要,因为Ruby允许你编写

obj[2, 3] = 4

而不是

obj.[]=(2, 3, 4)

这将是&#34;正常&#34;发送到名为[]=的方法的消息语法。 []=是一组具有语法糖的方法之一,允许以非标准方式调用它们。其他此类方法包括+-*/%<<>>,{{1} },|等,可以调用&代替a + ba.+(b)!+@,可以调用-@!a+a代替-aa.!a.+@a.-@,可以调用{ {1}}代替call,以及以a.(1, 2)结尾的任何方法,可以像a.call(1, 2)而不是=一样调用。 (以及其他一些人。)