>

나는 불협화음 서버에 대한 봇을 작성하고 있는데, 나는 욕설 필터 역할을하고 싶습니다. 텍스트 파일에서 잘못된 단어 목록을 읽고 배열에 저장합니다. 봇이 듣고있는 채널에서 사용자가 메시지를 보낼 때마다 봇은 해당 메시지에 하나 이상의 잘못된 단어가 포함되어 있는지 확인합니다. 이를 위해 다음 코드를 사용합니다.

badWords.each { |badword|
  if content.downcase.include? badword
    ...
  end
}

내 문제는 if 문이 true 를 반환한다는 것입니다.  메시지 내용의 잘못된 단어가 배열의 마지막 단어와 일치하는 경우에만 가능합니다. 배열의 다른 요소와 일치하면 false 를 리턴합니다. .

Array#each 의 기능이 있습니까  내가 오해하고있다 고요?

  • 답변 # 1

    와이즈 비즈 시도   strip 를 가질 수 있기 때문에 나쁜 단어  결국 로그인하십시오.

    \n
    
    

  • 답변 # 2

    코드를 작은 부분으로 나눠서 진행 상황을 더 잘 이해 한 다음 Ruby의 Enumerable 메소드 중 하나를 사용하여 간결하게 작성합니다. 또한 snake_case ( if content.downcase.include?(badword.strip) )의 루비 규칙을 사용합시다   bad_words 대신 ).

    먼저 badWords 를 확인합시다  array는 원하지 않는 문자를 포함하지 않습니다. bad_words 를 수정하는 것이 좋습니다  매번 각 요소를 수정하는 대신 반복하여 한 번 수집하십시오.

    우리는 컬렉션에 중복을 포함하지 않기 때문에 일치하는 요소를 찾기 위해 여러 번 검색하므로 Array를 Set으로 변환하여 효율성을 크게 높일 수 있습니다.

    bad_words
    
    

    다음에는 내용에 잘못된 단어가 포함되어 있는지 확인하는 메소드를 작성해 봅시다. 메소드 이름 끝에 물음표를 붙여 부울 값을 반환 함을 나타냅니다.

    require 'set'
    bad_words = bad_words.map(&:strip).to_set
    
    

    와이즈 비즈  다음 블록으로 전달 된 항목이 def profane?(content) bad_words.any? { |bad_word| content.include?(bad_word) } end 를 리턴하면 메소드는 true를 리턴합니다. .

    이제 수술 코드가 #any? 를 호출 할 수 있습니다  적절한 조치를 취하십시오 :

    true
    
    

    메소드가 profane? 를 리턴하도록했습니다.  내용이 비속 한 경우 def filter_bad_words(content) if profane?(content) bot.send_message(event.channel.id, "Sorry #{event.user.name}, this message made my profanity senses tingle!") bot.send_message(344559522003812354, "PROFANITY WARNING!!\n user: #{event.user.name}\n message: #{event.content}\n Please check if it is a cause for a warning. Use !?warn to give the user a warning.") event.message.delete true end end 를 반환합니다  내용이 부적절한 경우 기본적으로. 원하는 경우 다른 반환 값을 사용할 수 있으며 해당 응답에 따라 추가 조치를 취할 수 있습니다.

    true

  • 이전 r - 특수 변수 count를 재정렬하는 ggplot2
  • 다음 c++ - 이것이 동일합니까?