Ruby 如果不是nil,则指定对象的变量值

Ruby 如果不是nil,则指定对象的变量值,ruby,Ruby,当我尝试下面的作业时,出现“为零调用id…”错误: @selected = @items_design.items_categories[0].id 我想做的是分配 @selected = nil if @items_design.items_categories[0].id == nil 我试过这个: @selected = @items_design.items_categories[0].id || nil 还有其他几次尝试,但没有运气。每次都出现相同的错误。问题是@items\u

当我尝试下面的作业时,出现“为零调用id…”错误:

@selected = @items_design.items_categories[0].id
我想做的是分配

@selected = nil if @items_design.items_categories[0].id == nil
我试过这个:

@selected = @items_design.items_categories[0].id || nil

还有其他几次尝试,但没有运气。每次都出现相同的错误。

问题是@items\u design。items\u categories[0]为零。所以你可以试试这个

@selected = nil
@selected = @items_design.items_categories[0].id unless @items_design.items_categories[0].nil

Ruby在@items\u design告诉您。items\u categories[0]为零。这个怎么样:

@selected = 
  if @items_design.items_categories[0]
    @items_design.items_categories[0].id
  else
    nil
  end
或者这个:

@selected = @items_design.items_categories[0] ? @items_design.items_categories[0].id : nil
编辑:从评论中添加另一个选项,这是一个更甜蜜的方法(谢谢Daniël!):


在向该对象发送
id
消息之前,必须确保对象
@items\u design.items\u categories[0]
本身不是
nil
。这就是为什么您的“喜欢做”版本无法工作的原因,因为它仍然将
id
消息发送到一个最终为
nil
的对象。这会管用的

@selected = nil if @items_design.items_categories[0].nil?
但这仍然不是你想要的。试试下面这些:

@selected = @items_design.items_categories[0].nil? ? nil : @items_design.items_categories[0].id

你的第二次尝试

@selected = @items_design.items_categories[0].id || nil

无法工作,因为您总是将
id
消息发送到数组结果,即使它是nil.

,如果不是
nil
,那么?对这个问题也感到困惑。给出完整的错误堆栈。如果它不是nil,那么我希望它是@items\u design.items\u categories[0]的值。我要检查的
nil
value test…
如果X not nil
是无效语法。除非X.nil?或者
如果不是X.nil?
这就是将Ruby和python结合使用时的问题:)谢谢DanielI更喜欢第一个选项,它是一个很棒的Ruby。后者有点“meh”,因为三元组是粗俗的。我不同意,三元组语句又好又短:)。虽然最后一个也可以缩短
@selected=@items\u design.items\u categories[0]&&items\u design.items\u categories[0]。id
。如果第一部分为
nil
,这将是表达式的结果。谢谢,brain farting我也尝试了第二种解决方案,但忘了从三元组的第一部分删除.id。我不明白为什么它不起作用。好丹尼尔!我在答案中添加了这一点。我们可以通过将作业放置在
if
块之外来干涸您的第三个示例。当然可以。但我认为OP会从尽可能简单的代码中获益。接下来是Ruby的习惯用法。我喜欢丹尼尔的版本和三元版本。
if @items_design.items_categories[0].nil?
  @selected = nil
else
  @selected = @items_design.items_categories[0].id
end
@selected = @items_design.items_categories[0].id || nil