2

非常に単純な Ruby の質問があります。これをリファクタリングする方法はありますか:

<%= some_array.length if some_array.length > 1 %>

のようなものに

<%= some_array.length if self > 1 %>

「self」(たとえば) は、最初に計算された値を参照します。つまり、some_array.length?

4

7 に答える 7

5

いいえ、できません。ステートメントは、あなたが想定している方法で左から右に評価されません。ifステートメントが最初に評価されるため、テストする「自己」はありません。あなたが言うように、「最初に計算された値」は、ステートメントによって最初に計算されます。if

于 2012-04-18T15:24:56.807 に答える
1

メインテンプレートをシンプルに保ち、ロジックをヘルパーに取り込むのが好きです。erbには次のものを含めることができます。

<%= display_length(some_array) %>

ヘルパーに含まれる場所:

def display_length(array)
  array.length if array.length > 1
end

もちろん、ビジネスロジックを最もよく表すように名前を調整してください。

于 2012-04-18T15:57:07.077 に答える
1

2回計算したくない場合は、このようにすることができます

<% len = some_array.length %>
<%= len if len > 1 %>

それ以外の場合は、ヘルパー メソッドを作成できます。if の左側は右側の前に計算されないため、最初の質問は少し誤解を招く可能性があるため、計算された値として「自分自身」を渡すことができたとしても (擬似コード):

people.destroy_all if self > 100

これは常に「あなた自身」を生成するために破壊を計算します:D

于 2012-04-18T15:30:47.570 に答える
0

A.あなたはこのようなことをすることができます

<%= l = some_array.length if l > 1 %>

B.プレゼンターパターンを使用できます

于 2012-04-18T15:37:06.440 に答える
0

多分:

length if (length = some_array.length) > 1

少し難解ですが、短い...

于 2012-04-18T15:52:34.050 に答える
0

あなたができる最善のことは、多かれ少なかれ次のようなものです:

t = some_array.length; t if t > 1 

また、条件付き ( なし) の補間された ERB 式は、一方のelseケースと他方のケースで値を返すことに注意してくださいnil。ERB 実装は評価し、"" を生成result.to_sします。したがって、これは実行可能な設計パターンですが、後で登場するすべてのコード リーダーが簡単に理解できるとは限りません。#to_snil

于 2012-04-18T16:57:56.920 に答える
-2
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
于 2012-04-18T16:16:24.337 に答える