Упрощение цикла в Ruby


Я все еще довольно новыми для Ruby, и я действительно наслаждаюсь языком. Я наткнулся на этот метод в моем коде, и понял, что он может быть очищены:

def friend_all_followers(friends)
  client.followers.each do |follower|
    if not friends.include?(follower.screen_name)
      friend = Friend.new(:screen_name => follower.screen_name)
      client.friendship_create(friend.screen_name, true)
      friend.save
    end
  end
end

Так что я взял выше и сменил его на этот:

def friend_all_followers(friends)
  followers = client.followers.reject { |f| friends.include?(f) }
  followers.each do |follower|
    friend = Friend.new(:screen_name => follower.screen_name)
    client.friendship_create(friend.screen_name, true)
    friend.save
  end
end

Одним меньше уровень вложенности, и чище, чем первый способ. Но я смотрю на этот метод и не могу помочь, но думаю, там еще больше предстоит сделать. Любые идеи?

Как некоторые фоне друг - это и ActiveRecord класса, клиент является оберткой вокруг Твиттер АПИ клиента.последователи возвращает массив последователь объекты - объекты, я верю только хэши, но я не уверен на 100% в данный момент - и друзья - это строковый массив screen_nameС.



328
4
задан 18 мая 2011 в 02:05 Источник Поделиться
Комментарии
2 ответа

Вы можете заменить

friend = Friend.new(:screen_name => follower.screen_name)
client.friendship_create(friend.screen_name, true)
friend.save

С

friend = Friend.create(:screen_name => follower.screen_name)
client.friendship_create(friend.screen_name, true)

Я также предлагаю оборачивать создания друга в отдельный метод класса:

class Friend < ActiveRecord::Base
def create_with_follower(follower = nil)
return unless follower
create :screen_name => follower.screen_name
end
end

Тогда код будет такой:

friend = Friend.create_with_follower follower
client.friendship_create(friend.screen_name, true)

Я бы, наверное, скрыть friendship_create способ позвоните куда-нибудь тоже. Не уверен, что это правда ли. Это отдельный вызов API?

обновление

Теперь весь код будет такой:

def friend_all_followers(friends)
followers = client.followers.reject { |f| friends.include?(f) }
followers.each do |follower|
friend = Friend.create_with_follower follower
client.friendship_create(friend.screen_name, true)
end
end

Теперь вы можете сделать некоторые читаемых операции на массив. Что-то вроде этого:

def friend_all_followers(friends)
(client.followers - friends).each do |follower|
friend = Friend.create_with_follower follower
client.friendship_create(friend.screen_name, true)
end
end

7
ответ дан 18 мая 2011 в 02:05 Источник Поделиться

Сдача этого процедить, я понял, что я делаю две вещи в friend_all_followers. Первый-это фильтрация новых последователей, основанные на старых последователей (вызов переменной друзей скрывает этого, поэтому я переименовать его), а второй добавил в друзья все новых и новых поклонников. Потянув фильтрации в new_followers, я могу переименовать friend_all_followers более явные friend_new_followers такой:

def old_followers
# ... get old followers
end

def new_followers
client.followers.reject { |f| old_followers.include?(f) }
end

def friend_new_followers
new_followers.each do |follower|
friend = Friend.create(:screen_name => follower.screen_name)
client.friendship_create(friend.screen_name, true)
end
end

1
ответ дан 18 мая 2011 в 04:05 Источник Поделиться