非常に単純な Ruby の質問があります。これをリファクタリングする方法はありますか:
<%= some_array.length if some_array.length > 1 %>
のようなものに
<%= some_array.length if self > 1 %>
「self」(たとえば) は、最初に計算された値を参照します。つまり、some_array.length?
非常に単純な Ruby の質問があります。これをリファクタリングする方法はありますか:
<%= some_array.length if some_array.length > 1 %>
のようなものに
<%= some_array.length if self > 1 %>
「self」(たとえば) は、最初に計算された値を参照します。つまり、some_array.length?
いいえ、できません。ステートメントは、あなたが想定している方法で左から右に評価されません。if
ステートメントが最初に評価されるため、テストする「自己」はありません。あなたが言うように、「最初に計算された値」は、ステートメントによって最初に計算されます。if
メインテンプレートをシンプルに保ち、ロジックをヘルパーに取り込むのが好きです。erbには次のものを含めることができます。
<%= display_length(some_array) %>
ヘルパーに含まれる場所:
def display_length(array)
array.length if array.length > 1
end
もちろん、ビジネスロジックを最もよく表すように名前を調整してください。
2回計算したくない場合は、このようにすることができます
<% len = some_array.length %>
<%= len if len > 1 %>
それ以外の場合は、ヘルパー メソッドを作成できます。if の左側は右側の前に計算されないため、最初の質問は少し誤解を招く可能性があるため、計算された値として「自分自身」を渡すことができたとしても (擬似コード):
people.destroy_all if self > 100
これは常に「あなた自身」を生成するために破壊を計算します:D
多分:
length if (length = some_array.length) > 1
少し難解ですが、短い...
あなたができる最善のことは、多かれ少なかれ次のようなものです:
t = some_array.length; t if t > 1
また、条件付き ( なし) の補間された ERB 式は、一方のelse
ケースと他方のケースで値を返すことに注意してくださいnil
。ERB 実装は評価し、"" を生成result.to_s
します。したがって、これは実行可能な設計パターンですが、後で登場するすべてのコード リーダーが簡単に理解できるとは限りません。#to_s
nil
class Object
def block_scope
yield self
[] # Required for HAML and probably ERB as well
end
end
ERB:
<% array.length.block_scope do |l| %>
<%= l if l > 1 %>
<% end %>
ハムル:
- array.length.block_scope do |l|
= l if l > 1
単純な割り当てよりも視覚的に少し良い
アップデート
block_scope
名前空間への追加Object
はビューにとって間違いなくやり過ぎであることに同意します。より良い解決策はヘルパーを作成することです:
def block_scope(*args)
yield *args
[] #?
end
- block_scope(array.length) do |l|
= l if l > 1