可能重複:
What does ||= (or equals) mean in Ruby?回報率:解釋 「用戶|| = User.new」
Out on the internet我看到下面的語法的Ruby/Rails:
user ||= User.new
我是新手,我無法解析這個。有人可以向我解釋「|| =」運算符的用途嗎?
可能重複:
What does ||= (or equals) mean in Ruby?回報率:解釋 「用戶|| = User.new」
Out on the internet我看到下面的語法的Ruby/Rails:
user ||= User.new
我是新手,我無法解析這個。有人可以向我解釋「|| =」運算符的用途嗎?
如果已經設置了user
,那什麼都不做,否則它會分配一個新的User
對象(使用User.new
創建)。
According to David A. Black 「的良好的接地Rubyist」 的作者:
X || = y表示:X || x = y
所不同的是,如果x未定義,x || = y不會抱怨, 而如果您鍵入x || y, x = y,範圍內沒有x,它會。
對於一些添加的細節,這裏的parse.y相關部分:
| var_lhs tOP_ASGN command_call
{
/*%%%*/
value_expr($3);
if ($1) {
ID vid = $1->nd_vid;
if ($2 == tOROP) {
$1->nd_value = $3;
$$ = NEW_OP_ASGN_OR(gettable(vid), $1);
if (is_asgn_or_id(vid)) {
$$->nd_aid = vid;
}
}
else if ($2 == tANDOP) {
$1->nd_value = $3;
$$ = NEW_OP_ASGN_AND(gettable(vid), $1);
}
else {
$$ = $1;
$$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3));
}
}
NEW_OP_ASGN_OR
在node.h
定義:
#define NEW_OP_ASGN_OR(i,val) NEW_NODE(NODE_OP_ASGN_OR,i,val,0)
NEW_NODE
看起來是這樣的:
#define NEW_NODE(t,a0,a1,a2) rb_node_newnode((t),(VALUE)(a0),(VALUE)(a1),(VALUE)(a2))
尋找NODE_OP_ASGN_OR
導致compile.c
,其中最有趣的部分是這樣的:
case NODE_OP_ASGN_OR:{
LABEL *lfin = NEW_LABEL(nd_line(node));
LABEL *lassign;
if (nd_type(node) == NODE_OP_ASGN_OR) {
LABEL *lfinish[2];
lfinish[0] = lfin;
lfinish[1] = 0;
defined_expr(iseq, ret, node->nd_head, lfinish, Qfalse);
lassign = lfinish[1];
if (!lassign) {
lassign = NEW_LABEL(nd_line(node));
}
ADD_INSNL(ret, nd_line(node), branchunless, lassign);
}
else {
lassign = NEW_LABEL(nd_line(node));
}
COMPILE(ret, "NODE_OP_ASGN_AND/OR#nd_head", node->nd_head);
ADD_INSN(ret, nd_line(node), dup);
if (nd_type(node) == NODE_OP_ASGN_AND) {
ADD_INSNL(ret, nd_line(node), branchunless, lfin);
}
else {
ADD_INSNL(ret, nd_line(node), branchif, lfin);
}
ADD_INSN(ret, nd_line(node), pop);
ADD_LABEL(ret, lassign);
COMPILE(ret, "NODE_OP_ASGN_AND/OR#nd_value", node->nd_value);
ADD_LABEL(ret, lfin);
if (poped) {
/* we can apply more optimize */
ADD_INSN(ret, nd_line(node), pop);
}
break;
}
我覺得這是比我更想了解的關於Ruby的任務,但它是相當有趣的看這件事。
x || = y表示:x = x || y – 2013-03-27 16:24:26
該語句將自己設置爲user
(如果它已經是一個現有對象)或User.new
(如果用戶爲空,它將創建一個新用戶)。這是一個合乎邏輯的或將避免有一個分配的空用戶對象。
的代碼用於
user = user || User.new
的速記如果用戶爲空,則用戶將被設置爲User.new
。
這基本上是一個快捷方式:
user = user || User.new
或爲了更好的理解:
if user.nil?
user = User.new
end
我敢打賭,你以前見過類似的符號與像 '+'
i += 1
運營商
這也可以寫成:
i = i + 1
不僅'nil',也'false'。 – 2012-08-14 18:48:39
這種說法是相當於
user = user || User.new
這相當於
user = user ? user : User.new
它將當且僅當user
是零的User.new
值賦給變量user
。如果不是,則user
的內容將保持不變。
在這裏,'nil'或'false',不只是'nil'。 – 2012-08-14 18:50:36
我可能是錯的,但是如果他們不熟悉'|| =',我不會期望他們熟悉'?:' – Retsam 2012-08-14 18:55:27
爲什麼?許多語言都有三元運算符,並不是所有的都有'|| ='。 – 2012-08-14 18:56:22
這相當於user = user || User.new
。
這依賴於||
運營商的短路行爲。如果表達式的左邊是真的,那麼右邊將是什麼並不重要,整體表達式將是真實的,因此操作員「短路」並停止評估。而不是返回布爾值「真」,||
運算符返回它所評估的最後一個值。
所以,||=
是分配的默認值是有用的。如果user
具有值,則user || User.new
評估爲user
,否則評估爲User.new
,這是默認值。
的等效塊是:
if user
user = user
else
user = User.new
end
啊,很抱歉。我嘗試在此處的搜索框中輸入'|| =',但沒有出現。也許我的查詢被解釋爲幾個布爾運算符而不是字符串?我正在尋找錯誤的方式嗎? – 2012-08-14 18:54:08
我不知道SO如何處理像|| =這樣的字符。我用英文單詞或等號搜索。 – 2012-08-14 18:57:38
我會在下次嘗試。謝謝。 – 2012-08-14 18:58:13