Да, это возможно и полезно. Причина такова, что X внутри Y полезен для многих значений X и Y: композиционность. Программы создаются путем сборки крошечных компонентов на небольшие компоненты в более крупные компоненты в огромные компоненты в ... Иногда объединяется множество союзов в объединение, и что?
R .. Ответ показывает пример, где это происходит за кулисами: просто случается, что один из типов членов объединения является объединением, но вы не знаете этого, если не посмотрите на реализацию библиотеки.
EDIT. Обратите внимание, что общая идиома для дискриминированных объединений, где каждый член объединения является структурой, первое поле которого является интегральным типом, содержащим тег, не распространяется на вложенные объединения. То есть следующая стандартная (стандартная совместимость) ( N1256 §6.5.2.3.5) реализация дискриминированных объединений в C:
struct generic {
unsigned tag;
};
struct smallnum {
unsigned tag; /*always TAG_SMALLNUM*/
unsigned value;
};
struct bignum {
unsigned tag; /*always TAG_BIGNUM*/
size_t length;
unsigned *p;
};
struct string {
unsigned tag; /*always TAG_STRING*/
size_t length;
char *p;
};
union number {
struct bignum bignum;
struct smallnum smallnum;
};
union object {
struct generic generic;
struct bignum bignum;
struct smallnum smallnum;
struct string string;
};
Если у вас есть union object
x
, вы всегда можете прочитать его тег как x.generic.tag
(или x.bignum.tag
или любой другой), независимо от того, что было фактически присвоено объекту. Используя уникальные теги (дискриминаторы) для объектов.
Следующее определение является законным, но не полезно, поскольку вы не можете просто прочитать первое поле объекта union level2
для получения тега: if union level2
был записан как union number
, вы должны прочитать его тег через член number
, и в противном случае вы должны прочитать его тег через член generic
или string
. Я бы не удивился, если бы доступ через неправильный член работал на каждую существующую реализацию, но он не соответствует стандарту.
union level2 {
struct generic generic;
union number number;
struct string string;
};
Ваш цикл .item-name
предполагает, что их несколько, но затем снова выбирает .item-name, ожидая текстовых значений.
Вместо этого переберите родителей, затем найдите дочерние элементы для манипуляции, например:
$("table tbody tr").each(function() {
if ($(this).find(".item-name").text() == 'Chair' && $(this).find(".item-weight").text() >= 20.0) {
$(this).css("font-weight", "bold")
.css("background-color", "red");
} else {
$(this).css("font-weight", "normal");
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="col-xs-12">
<table class="table table-striped table-responsive">
<thead>
<tr>
<td colspan="8" class="room-report-heading-td">
<div class="room-report-heading">
<div class="each-room pull-left">
<span class="room-number">1.</span>
<span class="room-name">Room</span>
</div>
<div class="each-room-statistics pull-right">
<span class="room-stat">
1 items
•
5.0ft<sup>3</sup>
•
20.0lb
</span>
</div>
<br style="clear:both;">
</div>
</td>
</tr>
<tr class="columns-headings">
<th class="item-count">Count</th>
<th class="item-name">Name</th>
<th class="item-volume">Volume</th>
<th class="item-total-volume">Total Volume</th>
<th class="item-weight">Weight</th>
<th class="item-total-weight">Total weight</th>
</tr>
</thead>
<tbody>
<tr>
<td class="item-count"><span>1</span></td>
<td class="item-name"><span>Chair</span></td>
<td class="item-volume"><span>5.0</span></td>
<td class="item-total-volume"><span>5.0</span></td>
<td class="item-weight"><span>20.0</span></td>
<td class="item-total-weight"><span>20.0</span></td>
</tr>
<tr>
<td class="item-count"><span>1</span></td>
<td class="item-name"><span>Bed</span></td>
<td class="item-volume"><span>5.0</span></td>
<td class="item-total-volume"><span>5.0</span></td>
<td class="item-weight"><span>60.0</span></td>
<td class="item-total-weight"><span>20.0</span></td>
</tr>
</tbody>
</table>