我正在阅读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"
并且它不会改变任何东西,不是吗?
答案 0 :(得分:1)
1)为什么以及如何在这种情况下赋值方法指定a = 2 b = 3和c = 4?
a
,b
和c
是参数和2
,3
和4
是争论。参数与其他方法一样被绑定到参数,因为[]=
就像其他方法一样一个方法。
2)似乎它的行为类似于元素引用的方法,所以如果是这种情况,为什么它存在?我可以写:[...]
您也可以写obj.foo(2, 3, 4)
或obj.frobnicate(2, 3, 4)
或obj.(2, 3, 4)
。这没关系。它只是一种与其他方法一样的方法,而[]=
只是一个与其他名称一样的名称。你也可以写它
obj.[]=(2, 3, 4)
如果你愿意的话。
这个名字并不重要。 (无论如何,到电脑。)
除了名称 之外! (方法)名称是我们用来将代码的意图传达给我们(人类)同事的。
因此,[]
和[]=
是不同的名称,它们表达不同的意图。特别是,[]
将意图传达给获取某些内容,[]=
将意图传达给设置某事。但请注意,文档中的示例纯粹演示了如何为索引器和索引赋值方法绑定参数,它们不如何使用此类方法的良好示例;也许这是你困惑的一部分原因。一个更好的示例是[]
和[]=
类如何使用Array
和Hash
方法。
另请注意&#34;名称并不重要&#34;有点夸张。名称确实很重要,因为Ruby允许你编写
obj[2, 3] = 4
而不是
obj.[]=(2, 3, 4)
这将是&#34;正常&#34;发送到名为[]=
的方法的消息语法。 []=
是一组具有语法糖的方法之一,允许以非标准方式调用它们。其他此类方法包括+
,-
,*
,/
,%
,<<
,>>
,{{1} },|
等,可以调用&
代替a + b
,a.+(b)
,!
,+@
,可以调用-@
,!a
和+a
代替-a
,a.!
和a.+@
,a.-@
,可以调用{ {1}}代替call
,以及以a.(1, 2)
结尾的任何方法,可以像a.call(1, 2)
而不是=
一样调用。 (以及其他一些人。)